OpenCV 3.4.2を使用してAndroidでカメラ画像を加工し、その過程を左右に並べて表示しようとしています。
そのための足掛かりとしてまずは同じ画像を左右に並べようとしています。
SDKに付属しているサンプルを参考に単純にCameraBridgeViewBaseを2つに増やしてみましたが、以下の画像に示す通り上手くいきませんでした。
起動直後は次の画像のようになり、右側のビューのみが有効化しました。
左側には間違いなくビューが存在することは確認済みです。
そこで左右それぞれについてenableView
とdisableView
を行うボタンを設置して操作すると左側のビューも動作しました。
しかし今度は右側のビューの更新が停止してしまいました。
画像だと分かりにくいですが、次の画像は右側はそのまま、左側のみが更新されている様子を撮影したものです。
左右のビューを同時に更新するにはどうすればいいでしょうか。
(それともそもそもできないのでしょうか。)
kotlin
1import android.app.Activity 2import android.os.Bundle 3import android.util.Log 4import kotlinx.android.synthetic.main.activity_main.* 5import org.opencv.android.BaseLoaderCallback 6import org.opencv.android.CameraBridgeViewBase 7import org.opencv.android.LoaderCallbackInterface 8import org.opencv.android.OpenCVLoader 9import org.opencv.core.CvType 10import org.opencv.core.Mat 11import org.opencv.core.Size 12import org.opencv.imgproc.Imgproc 13 14class MainActivity : Activity() { 15 // 画面左のビュー 16 private lateinit var mOpenCvCameraView: CameraBridgeViewBase 17 // 画面右のビュー 18 private lateinit var mOpenCvCameraView2: CameraBridgeViewBase 19 // 準備完了を受け取るコールバック 20 private val mLoaderCallback = object : BaseLoaderCallback(this) { 21 override fun onManagerConnected(status: Int) { 22 when (status) { 23 LoaderCallbackInterface.SUCCESS -> { 24 // 左側の表示を開始 25 Log.d("LEFT", "before enableView()") 26 mOpenCvCameraView.enableView() 27 mOpenCvCameraView.enableFpsMeter() 28 Log.d("LEFT", "after enableView()") 29 // 右側の表示を開始 30 Log.d("RIGHT", "before enableView()") 31 mOpenCvCameraView2.enableView() 32 mOpenCvCameraView2.enableFpsMeter() 33 Log.d("RIGHT", "after enableView()") 34 35 // 最後に有効化したものだけ有効になるという仮説の下 36 // 上の2つの順番を入れ替えたが、最初に有効になるビューは右のまま変わらず。 37 } 38 else -> { 39 super.onManagerConnected(status) 40 } 41 } 42 } 43 } 44 45 override fun onCreate(savedInstanceState: Bundle?) { 46 super.onCreate(savedInstanceState) 47 setContentView(R.layout.activity_main) 48 49 mOpenCvCameraView = findViewById(R.id.java_camera_view) 50 mOpenCvCameraView.setCvCameraViewListener(CameraListener("LEFT")) 51 52 mOpenCvCameraView2 = findViewById(R.id.java_camera_view2) 53 mOpenCvCameraView2.setCvCameraViewListener(CameraListener("RIGHT")) 54 55 // 以下テスト用のボタン類 56 57 bt_left_e.setOnClickListener { 58 mOpenCvCameraView.enableView() 59 } 60 61 bt_right_e.setOnClickListener { 62 mOpenCvCameraView2.enableView() 63 } 64 65 bt_left_d.setOnClickListener { 66 mOpenCvCameraView.disableView() 67 } 68 69 bt_right_d.setOnClickListener { 70 mOpenCvCameraView2.disableView() 71 } 72 } 73 74 override fun onPause() { 75 super.onPause() 76 mOpenCvCameraView.disableView() 77 mOpenCvCameraView2.disableView() 78 } 79 80 override fun onResume() { 81 super.onResume() 82 if (OpenCVLoader.initDebug()) { 83 mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS) 84 } else { 85 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, mLoaderCallback) 86 } 87 } 88 89 override fun onDestroy() { 90 super.onDestroy() 91 mOpenCvCameraView.disableView() 92 mOpenCvCameraView2.disableView() 93 } 94 95 class CameraListener(val tag: String) : CameraBridgeViewBase.CvCameraViewListener2 { 96 private lateinit var edgeMat: Mat 97 private lateinit var dilatedMat: Mat 98 private lateinit var denoisedMat: Mat 99 private lateinit var colorMat: Mat 100 private lateinit var dilateKernel: Mat 101 102 override fun onCameraViewStarted(width: Int, height: Int) { 103 Log.d(tag, "onCameraViewStarted($width, $height)") 104 105 edgeMat = Mat(width, height, CvType.CV_8UC1) 106 dilatedMat = Mat(width, height, CvType.CV_8UC1) 107 denoisedMat = Mat(width, height, CvType.CV_8UC1) 108 colorMat = Mat(width, height, CvType.CV_8UC3) 109 dilateKernel = Mat() 110 } 111 112 override fun onCameraViewStopped() { 113 Log.d(tag, "onCameraViewStopped()") 114 115 edgeMat.release() 116 dilatedMat.release() 117 denoisedMat.release() 118 colorMat.release() 119 dilateKernel.release() 120 } 121 122 override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame): Mat { 123 Log.d(tag, "onCameraFrame(inputFrame)") 124 // エッジ抽出 125 Imgproc.Canny(inputFrame.gray(), edgeMat, 80.0, 100.0) 126 // 膨張 127 Imgproc.dilate(edgeMat, dilatedMat, dilateKernel) 128 // ぼかし 129 Imgproc.GaussianBlur(dilatedMat, denoisedMat, Size(3.0, 3.0), 10.0) 130 //色変換 131 Imgproc.applyColorMap(denoisedMat, colorMat, Imgproc.COLORMAP_SUMMER) 132 return colorMat //一連の加工はテストで深い意味は無し 133 } 134 } 135} 136
あなたの回答
tips
プレビュー