前提
AndoroidStudioで読み込んだ動画の明度を変換するアプリを作ろうと思っています。
使用言語はJavaです。
CameraXとOpenCVを使った画像処理向けAndroidアプリのひな形
こちらの記事を参考にし、CameraX ライブラリを使用して動画像を取得し、
OpenCV(opencv_java4)でRGB変換を行う予定です。
実現したいこと
Mat型配列へ1画素ずつアクセスし、RGBでの明度変換を行いたい。
(RGB値全てに同じ数を掛けると明度を上げることができる)
コードの流れとしては
AndoroidStudioでCameraXライブラリを使用して動画像を取得
→取得した動画像をOpenCVで使用できるように変換(Imgproc.COLOR_YUV2RGB_NV21 で変換)
→処理を行った後Mat型からBitmap型へ変換(Utils.matToBitmap(mat, bitmap);)
→画面を二分割した下側に表示
という流れで処理を書いています。
発生している問題・エラーメッセージ
読み込んだ画像をMat型に変換し、Bitmapに変換して画面に表示はされるのですが色がおかしいです。
グレースケール画像に変換したときは何ともないのですが、カラーで表示しようとするとおかしくなります。
該当のソースコード
Java
1 public void analyze(@NonNull ImageProxy image) { 2 /* Create cv::mat(RGB888) from image(NV21) */ 3 Mat matOrg = getMatFromImage(image); 4 /* 画像を回転 */ 5 Mat fixMat = fixMatRotation(matOrg); 6 7 /*** 8 Log.i(TAG, "[analyze] width = " + image.getWidth() + ", height = " + image.getHeight() + "Rotation = " + previewView.getDisplay().getRotation()); 9 Log.i(TAG, "[analyze] mat width = " + fixMat.cols() + ", mat height = " + fixMat.rows()); 10 type = 16, depth = 0, channels = 3, isContinuous = true 11 Log.i(TAG, "type = " + fixMat.type() + ", depth = " + fixMat.depth() + ", channels = " + fixMat.channels() + ", isContinuous = " + fixMat.isContinuous()); 12 ***/ 13 Size sizeMat = fixMat.size(); 14 Mat mat = fixMat.clone(); 15 16 for (int i = 0; i < fixMat.height(); i++){ 17 for (int j = 0; j < fixMat.width(); j++){ 18 double[] data = fixMat.get(i,j); 19 data[0] = data[0] / 2; 20 data[1] = data[1] / 2; 21 data[2] = data[2] / 2; 22 mat.put(i,j,data); 23 } 24 }
試したこと
fixmatの要素を取得したところ、type = 16, depth = 0, channels = 3, isContinuous = trueが返ってきました。
ビット深度はCV_8U, チャンネル数が3のカラー画像です。
グレースケール画像では正常に表示されるので、
NV21→RGB(Mat型)→RGB2GRAY→GRA2RGB(BGRも試しました)→Bitmapに変換
という流れでカラーにしようと思ったのですが表示されるのはグレースケール画像でカラーに戻りませんでした。
補足情報(FW/ツールのバージョンなど)
Android studio Dolphin 2021/3/1
OpenCV opencv_java4

回答1件
あなたの回答
tips
プレビュー