前提
AndoroidStudioで読み込んだ動画の明度を変換するアプリを作ろうと思っています。
使用言語はJavaです。
CameraX ライブラリを使用して動画像を取得し、
OpenCVでRGB変換を行う予定です。
実現したいこと
Mat行列において、画素にアクセスしRGB値を比較したり掛け算をしたい。
発生している問題・エラーメッセージ
C言語では
cv::vec3b p = Mat.atcv::Vec3b(2, 5);
画素の変更は
Mat.atcv::Vec3b(y, x)[0] = xx; //青
Mat.atcv::Vec3b(y, x)[1] = xx; //緑
Mat.atcv::Vec3b(y, x)[2] = xx; //赤
のように出来るという記事を見つけましたが、Javaではどのように記述するのか理解できませんでした。
Java
1for (double v = 0; v < mat.rows(); v++){ 2 for (double u = 0; u < mat.cols(); u++){ 3 Scalar p = mat.at(u,v); 4 } 5}
のように記述してみたのですが使えませんでした。
該当する関数はこのように記述しています。
Java
1 private class MyImageAnalyzer implements ImageAnalysis.Analyzer { 2 private Mat matPrevious = null; 3 4 @Override 5 public void analyze(@NonNull ImageProxy image) { 6 /* Create cv::mat(RGB888) from image(NV21) */ 7 Mat matOrg = getMatFromImage(image); 8 9 /* Fix image rotation (it looks image in PreviewView is automatically fixed by CameraX???) */ 10 Mat mat = fixMatRotation(matOrg); 11 12 Log.i(TAG, "[analyze] width = " + image.getWidth() + ", height = " + image.getHeight() + "Rotation = " + previewView.getDisplay().getRotation()); 13 Log.i(TAG, "[analyze] mat width = " + matOrg.cols() + ", mat height = " + matOrg.rows()); 14 //type = 16, depth = 0, channels = 3, isContinuous = true 15 Log.i(TAG, "type = " + matOrg.type() + ", depth = " + matOrg.depth() + ", channels = " + matOrg.channels() + ", isContinuous = " + matOrg.isContinuous()); 16 17 for (double v = 0; v < mat.rows(); v++){ 18 for (double u = 0; u < mat.cols(); u++){ 19 Scalar p = mat.at(u,v); 20 //1画素ずつ取り出す 21 //RGBの値を比較して、2したり1/2したい 22 } 23 } 24 25 /* Convert cv::mat to bitmap for drawing */ 26 Bitmap bitmap = Bitmap.createBitmap(mat.cols(), mat.rows(),Bitmap.Config.ARGB_8888); 27 Utils.matToBitmap(mat, bitmap); 28 29 /* Display the result onto ImageView */ 30 runOnUiThread(new Runnable() { 31 @Override 32 public void run() { 33 imageView.setImageBitmap(bitmap); 34 } 35 }); 36 37 /* Close the image otherwise, this function is not called next time */ 38 image.close(); 39 }
回答1件
あなたの回答
tips
プレビュー