Commit bde90caf authored by 马乐's avatar 马乐

调整图片大小

parent 41e46616
......@@ -15,6 +15,9 @@ import androidx.core.content.ContextCompat
import com.arcsoft.visdrive.avmsdk.ArcErrorInfo
import com.arcsoft.visdrive.avmsdk.ArcVisDriveAVMEngine
import com.arcsoft.visdrive.avmsdk.constant.avm.ArcAVMType
import com.arcsoft.visdrive.avmsdk.model.avm.ArcAVMCalibInfo
import com.arcsoft.visdrive.avmsdk.model.avm.ArcAVMCalibResult
import com.arcsoft.visdrive.avmsdk.model.avm.ArcAVMLookupTable
import com.arcsoft.visdrive.avmsdk.model.avm.ArcAVMOutputImage
import com.arcsoft.visdrive.avmsdk.model.common.ArcActiveEnvParam
import com.blankj.utilcode.util.FileUtils
......@@ -37,9 +40,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
......@@ -70,8 +73,12 @@ class MainActivity : AppCompatActivity() {
private var job:Job? = null
private var avmPlayJob:Job? = null
private var avmStartScope:AvmCoroutineScope ?= null
private val channel = Channel<Boolean>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
......@@ -98,7 +105,7 @@ class MainActivity : AppCompatActivity() {
}
binding.activeAvm.setOnClickListener {
avmCoroutineScope.launch {
val result = ArcVisDriveAVMEngine.activate(
var result = ArcVisDriveAVMEngine.activate(
APP_ID, APP_SECRET, ArcAVMType.AVM_CAM_4,
ArcActiveEnvParam().apply {
this.IMEI = "d5e2f07694f674c4"
......@@ -110,7 +117,14 @@ class MainActivity : AppCompatActivity() {
Toast.makeText(this@MainActivity,"激活成功",Toast.LENGTH_SHORT).show()
}
spUtils.put(IS_ACTIVATED,true)
coroutineContext[AvmCoroutineContext]?.engine?.initializeAvmParams(calibResultPath,lookupPath)
result = coroutineContext[AvmCoroutineContext]?.engine?.initializeAvmParams(calibResultPath,lookupPath)?:ArcErrorInfo.ARC_ERROR_BAD_STATE
if (result == ArcErrorInfo.ARC_ERROR_OK) {
val getCalibInfo = ArcAVMCalibInfo()
val getCalibResult = ArcAVMCalibResult()
val getLookupTable = ArcAVMLookupTable()
result = avmEngine.getCalibrateResults(getCalibInfo, getCalibResult, getLookupTable)
LogUtils.i("getCalibrateResults:${result}, calibInfo:${getCalibInfo}, result:${getCalibResult.data.size}, lookup:${getLookupTable.data.size}")
}
} else {
LogUtils.e("激活失败!")
withContext(Dispatchers.Main){
......@@ -122,7 +136,67 @@ class MainActivity : AppCompatActivity() {
}
binding.autoCalib.setOnClickListener {
avmCoroutineScope.launch {
coroutineContext[AvmCoroutineContext]?.engine?.autoCalib(calibResultPath,lookupPath)
launch(Dispatchers.Default) {
avmFrontCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofFront(data).also {
avmInputImages[0] = it
}
}
}
)
}
launch(Dispatchers.Default) {
avmRightCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofRight(data).also {
avmInputImages[1] = it
}
}
}
)
}
launch(Dispatchers.Default) {
avmBackCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofBack(data).also {
avmInputImages[2] = it
}
}
}
)
}
launch(Dispatchers.Default) {
avmLeftCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofLeft(data).also {
avmInputImages[3] = it
}
}
}
)
}
while (avmInputImages.filterNotNull().size != 4) {
LogUtils.d("input list size:${avmInputImages.filterNotNull()}")
delay(100)
}
val result = coroutineContext[AvmCoroutineContext]?.engine?.autoCalib(calibResultPath,lookupPath)
if (result != null) {
launch(Dispatchers.IO){
avmLeftCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
avmFrontCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
avmRightCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
avmBackCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
}
}
}
}
......@@ -136,76 +210,76 @@ class MainActivity : AppCompatActivity() {
if (avmStartScope == null) {
avmStartScope = AvmCoroutineScope(AvmCoroutineContext(engine = avmEngine) + Dispatchers.IO + COROUTINE_AVM + Job())
}
val channel = Channel<Boolean>()
avmStartScope?.launch {
launch(Dispatchers.Default) {
avmPlayJob = avmStartScope?.launch {
try {
val frontScope = CoroutineScope(Dispatchers.Default)
avmFrontCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
configCameraSequence(avmDir.absolutePath) { _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofFront(data).also {
avmInputImages[0] = it
launch {
frontScope.launch {
ensureActive()
channel.send(true)
}
}
}
}
)
}
launch(Dispatchers.Default) {
val rightScope = CoroutineScope(Dispatchers.Default)
avmRightCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
configCameraSequence(avmDir.absolutePath) { _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofRight(data).also {
avmInputImages[1] = it
launch {
rightScope.launch {
ensureActive()
channel.send(true)
}
}
}
}
)
}
launch(Dispatchers.Default) {
val backScope = CoroutineScope(Dispatchers.Default)
avmBackCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
configCameraSequence(avmDir.absolutePath) { _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofBack(data).also {
avmInputImages[2] = it
launch {
backScope.launch {
ensureActive()
channel.send(true)
}
}
}
}
)
}
launch(Dispatchers.Default) {
val leftScope = CoroutineScope(Dispatchers.Default)
avmLeftCamera.startPictureSequence(
PictureSequenceSource.GENERAL_CAMERA,
configCameraSequence(avmDir.absolutePath){ _, _, status, data, _ ->
configCameraSequence(avmDir.absolutePath) { _, _, status, data, _ ->
if (status == SpmCameraDevice.ImageDataCallback.IMAGE_STATUS_SUCCEEDED) {
ArcAVMInputImageFactory.ofLeft(data).also {
avmInputImages[3] = it
launch {
leftScope.launch {
ensureActive()
channel.send(true)
}
}
}
}
)
}
val outputImageList = arrayListOf<ArcAVMOutputImage>()
while (avmInputImages.size != 4) {
while (avmInputImages.filterNotNull().size != 4) {
delay(100)
}
LogUtils.d("准备播放融合图...")
if (spUtils.getBoolean(CALIB_RESULT) && spUtils.getBoolean(LOOKUP_TABLE)) {
launch(Dispatchers.Default) {
while (channel.receive()) {
ensureActive()
val result = coroutineContext[AvmCoroutineContext]?.engine?.drawAVM(
31,
avmInputImages,
......@@ -217,22 +291,25 @@ class MainActivity : AppCompatActivity() {
}
}
}
}
} else {
withContext(Dispatchers.Main){
Toast.makeText(this@MainActivity,"请先进行标定",Toast.LENGTH_SHORT).show()
}
}
withContext(Dispatchers.Main) {
Toast.makeText(this@MainActivity, "请先进行标定", Toast.LENGTH_SHORT)
.show()
}
}
binding.stopAvm.setOnClickListener {
avmStartScope?.launch {
} catch (e: CancellationException) {
LogUtils.e("${e.message}")
avmLeftCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
avmFrontCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
avmRightCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
avmBackCamera.stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
cancel(kotlinx.coroutines.CancellationException("Click Stop Avm Button"))
} catch (e: Throwable) {
e.printStackTrace()
}
}
}
binding.stopAvm.setOnClickListener {
avmPlayJob?.cancel(CancellationException("结束AVM实时渲染"))
closeAuxiliaryPresentation()
}
}
......
......@@ -99,19 +99,19 @@ fun ArcVisDriveAVMEngine.initializeAvmParams(calibResultPath:File,lookupPath:Fil
avmInitInfo.avmIntrinsicParamArray = intrinsicArray
val calibInfo = ArcAVMCalibInfo()
calibInfo.avm2DImageWidth = IMAGE_WIDTH
calibInfo.avm2DImageHeight = IMAGE_HEIGHT
calibInfo.singleImageWidth = 480
calibInfo.singleImageHeight = 456
calibInfo.avm2DImageWidth = IMAGE_HEIGHT
calibInfo.avm2DImageHeight = IMAGE_WIDTH
calibInfo.singleImageWidth = IMAGE_WIDTH
calibInfo.singleImageHeight = IMAGE_HEIGHT
val carInfo = ArcAVMCarInfo()
carInfo.width = 2500
carInfo.length = 6000
carInfo.width = 590
carInfo.length = 1800
carInfo.blinkAreaFront = 0
carInfo.blinkAreaRight = 0
carInfo.blinkAreaBack = 0
carInfo.blinkAreaLeft = 0
calibInfo.avmCarInfo = carInfo
calibInfo.viewPortType = ArcAVMViewPortType.LARGE.value
calibInfo.viewPortType = ArcAVMViewPortType.SMALL.value
avmInitInfo.avmCalibInfo = calibInfo
if (spUtils.getBoolean(CALIB_RESULT)) {
val avmCalibResult = ArcAVMCalibResult()
......@@ -130,13 +130,13 @@ fun ArcVisDriveAVMEngine.initializeAvmParams(calibResultPath:File,lookupPath:Fil
return init(avmInitInfo)
}
fun ArcVisDriveAVMEngine.autoCalib(calibResultPath:File,lookupPath:File){
fun ArcVisDriveAVMEngine.autoCalib(calibResultPath:File,lookupPath:File):Int{
val clothInfo = ArcAVMClothInfo()
clothInfo.d1 = 600
clothInfo.d3 = 5000
clothInfo.d4 = 4900
clothInfo.d5 = 5000
clothInfo.d6 = 4000
clothInfo.d1 = 120
clothInfo.d3 = 690
clothInfo.d4 = 690
clothInfo.d5 = 690
clothInfo.d6 = 690
val chessInfoFront = ArcAVMChessInfo(ArcAVMCameraPosType.TYPE_FRONT)
val chessInfoRight = ArcAVMChessInfo(ArcAVMCameraPosType.TYPE_RIGHT)
val chessInfoBack = ArcAVMChessInfo(ArcAVMCameraPosType.TYPE_BACK)
......@@ -144,36 +144,38 @@ fun ArcVisDriveAVMEngine.autoCalib(calibResultPath:File,lookupPath:File){
val chessInfoList = arrayListOf(chessInfoFront, chessInfoRight, chessInfoBack, chessInfoLeft)
val calibResult = ArcAVMCalibResult()
val lookupTable = ArcAVMLookupTable()
var result = autoCalibrate(avmInputImages, clothInfo, chessInfoList, calibResult, lookupTable)
LogUtils.i("autoCalibrate:${result}")
return autoCalibrate(avmInputImages, clothInfo, chessInfoList, calibResult, lookupTable).also {result->
LogUtils.i("auto calibrate result = $result")
if (result == ArcErrorInfo.ARC_ERROR_OK) {
LogUtils.i("autoCalibrate calibResult:${calibResult.data.size}")
LogUtils.i("autoCalibrate lookupTable:${lookupTable.data.size}")
spUtils.put(CALIB_RESULT,FileIOUtils.writeFileFromBytesByChannel(calibResultPath, calibResult.data, true))
spUtils.put(LOOKUP_TABLE,FileIOUtils.writeFileFromBytesByChannel(lookupPath, lookupTable.data, true))
} else {
spUtils.put(CALIB_RESULT,false)
spUtils.put(LOOKUP_TABLE,false)
LogUtils.e("autoCalibrate failed, chessPoints1:${chessInfoList[0].leftChessPoints[0].x}_${chessInfoList[0].leftChessPoints[0].y}," +
"chessPoints2:${chessInfoList[1].leftChessPoints[1].x}_${chessInfoList[1].leftChessPoints[1].y}," +
"chessPoints3:${chessInfoList[2].leftChessPoints[2].x}_${chessInfoList[2].leftChessPoints[2].y}," +
"chessPoints4:${chessInfoList[3].leftChessPoints[3].x}_${chessInfoList[3].leftChessPoints[3].y},")
}
val getCalibInfo = ArcAVMCalibInfo()
val getCalibResult = ArcAVMCalibResult()
val getLookupTable = ArcAVMLookupTable()
result = getCalibrateResults(getCalibInfo, getCalibResult, getLookupTable)
if (result == ArcErrorInfo.ARC_ERROR_OK) {
val getCalibrateResults = getCalibrateResults(getCalibInfo, getCalibResult, getLookupTable)
if (getCalibrateResults == ArcErrorInfo.ARC_ERROR_OK) {
LogUtils.i("getCalibrateResults, calibInfo:${getCalibInfo}, result:${getCalibResult.data.size}, lookup:${getLookupTable.data.size}")
}
}
}
fun ArcVisDriveAVMEngine.manualCalib(calibResultPath:File,lookupPath:File){
val clothInfo = ArcAVMClothInfo()
clothInfo.d1 = 600
clothInfo.d3 = 5000
clothInfo.d4 = 4900
clothInfo.d5 = 5000
clothInfo.d6 = 4000
clothInfo.d1 = 120
clothInfo.d3 = 680
clothInfo.d4 = 680
clothInfo.d5 = 810
clothInfo.d6 = 810
val chessInfoFront = ArcAVMChessInfo()
chessInfoFront.imagePosType = ArcAVMCameraPosType.TYPE_FRONT
if (chessInfoFront.leftChessPoints != null) {
......@@ -339,8 +341,8 @@ fun configCameraSequence(path:String,callback: ImageReaderEx.ImageCallback): Pic
return PictureConfiguration.get(PictureSequenceSource.GENERAL_CAMERA).apply {
mPath = path
mImageFormat = SpmCameraDevice.ImageDataCallback.IMAGE_FORMAT_NV21
mPicWidth = 1280
mPicHeight = 720
mPicWidth = IMAGE_WIDTH
mPicHeight = IMAGE_HEIGHT
mImageCallback = callback
}
}
package com.waytous.avmdetect
package com.intergration.avm.glsurface
import android.opengl.GLES20
import android.opengl.GLSurfaceView
import android.opengl.Matrix
import com.blankj.utilcode.util.LogUtils
import com.intergration.avm.glsurface.MyGLProgram
import java.nio.ByteBuffer
import javax.microedition.khronos.opengles.GL10
......
package com.waytous.avmdetect
package com.intergration.avm.glsurface
import android.content.Context
import android.opengl.GLSurfaceView
......
......@@ -9,8 +9,7 @@ import com.intergration.avm.R
import com.intergration.avm.utils.IMAGE_HEIGHT
import com.intergration.avm.utils.IMAGE_WIDTH
import com.mediatek.smartplatform.PictureConfiguration
import com.waytous.avmdetect.MyGLSurfaceView
import org.greenrobot.eventbus.EventBus
import com.intergration.avm.glsurface.MyGLSurfaceView
class AuxiliaryScreenPresentation(outerContext: Context, display: Display) :
Presentation(outerContext, display) {
......@@ -26,8 +25,7 @@ class AuxiliaryScreenPresentation(outerContext: Context, display: Display) :
frameLayout = layoutInflater.inflate(R.layout.layout_presentation,null) as FrameLayout
setContentView(frameLayout)
rendererView = frameLayout.findViewById<MyGLSurfaceView?>(R.id.rendererView).also {
it.setDisplayOrientation(90)
it.setYuvDataSize(IMAGE_WIDTH, IMAGE_HEIGHT)
it.setYuvDataSize(IMAGE_HEIGHT,IMAGE_WIDTH)
}
}
......
......@@ -40,6 +40,8 @@ private val serviceConnection: ServiceConnection = object : ServiceConnection {
}
override fun onServiceDisconnected(name: ComponentName?) {
LogUtils.d("停止副屏服务...")
multiScreenService?.dismissSecondPresentation()
//恢复置空
multiScreenService = null
}
......@@ -51,10 +53,8 @@ fun Context.openAuxiliaryPresentation(){
}
fun Context.closeAuxiliaryPresentation(){
if (multiScreenService != null) {
multiScreenService?.dismissSecondPresentation()
LogUtils.i("解绑副屏服务")
unbindService(serviceConnection)
}
}
fun feedData(data: ByteArray){
......
......@@ -9,7 +9,7 @@
android:textSize="24sp"
android:textColor="@android:color/holo_blue_light"
android:layout_gravity="center_horizontal|top"/>
<com.waytous.avmdetect.MyGLSurfaceView
<com.intergration.avm.glsurface.MyGLSurfaceView
android:id="@+id/rendererView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment