OpenCv Android Studio3.5 超個人的なメモ
- Opencv4.1.1はAndroid Studio3.5では使えなかった。
- 4.1.0にすると取り敢えず画像表示とかは上手くできた。
- 4.x.xからはインポートというかプロジェクトの設定が簡単になっているようで、jni系の.soファイルとかはプロジェクトに入れなくて良くなったみたい。
- backカメラから画像を表示させてみたけど、3~4fpsほどの性能しか得られなかった。こんなもん?
- frontカメラから画像を表示させると30fpsくらいは出るので実用範囲内だと思った。
- 使ったMatのインスタンスはことごとくrelease()した方が良さげ。
- 画像の回転は面倒だけど丁寧にコーディングした。簡単にflipとかtransposeとかで回転できるような説明のサイトもあったが、出来なかった。回転処理に関しては少し長めのコードだが、fpsに大きな影響を与えることもなく処理できているようだった。
Mat m = inputFrame.rgba(); Point[] srcTri = new Point[3]; srcTri[0] = new Point(0, 0); srcTri[1] = new Point(m.cols() - 1, 0); srcTri[2] = new Point(0, m.rows() - 1); Mat warpMat = Imgproc.getAffineTransform(new MatOfPoint2f(srcTri), new MatOfPoint2f(srcTri)); Mat warpDst = Mat.zeros(m.rows(), m.cols(), m.type()); Imgproc.warpAffine(m, warpDst, warpMat, warpDst.size()); Point center = new Point(warpDst.cols() / 2, warpDst.rows() / 2); double angle; // 事前にカメラ別の回転角度を得ておく必要あり if ( cam_num == Camera.CameraInfo.CAMERA_FACING_BACK ) { angle = cam_back_degree; } else if (cam_num == Camera.CameraInfo.CAMERA_FACING_FRONT) { angle = cam_front_degree; } else { angle = cam_back_degree; } double scale = 1.0; Mat rotMat = Imgproc.getRotationMatrix2D(center, angle, scale); Mat warpRotateDst = new Mat(); Imgproc.warpAffine(warpDst, warpRotateDst, rotMat, warpDst.size()); setMat(warpRotateDst); // マルチスレッドでMat使うので
- 画像解析の処理を高速化するのに役立ったのは画像のサイズを変更する処理だった。Bitmap.createScaledBitmap() まぁこれはAndroidのbitmapに準備された関数だけど。(filterをtrueにすると少しシャギーが減る)