🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2103閲覧

Android Studio(java)上のcountNonZero(OpenCV)を使用するとアプリが強制終了される

NieR2B

総合スコア1

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/12/23 01:27

#実現したいこと
Android Studio上でOpenCVを使用して
カメラからの映像を2値化(黒とそれ以外)表示して、ある矩形領域における変動する黒色の割合(ピクセル数でも可)を表示したい

#開発・実行環境
[開発]
Android Studio 4.0.1
MacBook Pro (macOS Mojave ver10.14.6)
-言語- java

[実行]
OPPO Reno A 128GB

#発生している問題・エラーメッセージ
・黒要素とそれ以外に分けて表示する
・矩形領域を指定する
以上のことは出来たのですが

OpenCVのcountNonZeroを使用して黒のピクセル数を数えるという所で
countNonZero関数を書き込んだ時点でアプリ起動直後にアプリ強制終了が起きて
アプリを起動することが出来ません。

エラーメッセージは特になく、書き込めはするけど起動は出来ないと言った感じです。

#該当のソースコード

java

1package com.example.line; 2 3import androidx.annotation.NonNull; 4import androidx.appcompat.app.AppCompatActivity; 5import androidx.camera.core.Camera; 6import androidx.camera.core.CameraSelector; 7import androidx.camera.core.ImageAnalysis; 8import androidx.camera.core.ImageProxy; 9import androidx.camera.core.Preview; 10import androidx.camera.lifecycle.ProcessCameraProvider; 11import androidx.camera.view.PreviewView; 12import androidx.core.app.ActivityCompat; 13import androidx.core.content.ContextCompat; 14import androidx.lifecycle.LifecycleOwner; 15 16import android.Manifest; 17import android.app.Activity; 18import android.content.Context; 19import android.content.pm.PackageManager; 20import android.graphics.Bitmap; 21import android.os.Bundle; 22import android.util.Log; 23import android.view.Surface; 24import android.widget.ImageView; 25 26import com.google.common.util.concurrent.ListenableFuture; 27 28import org.opencv.android.Utils; 29import org.opencv.core.Core; 30import org.opencv.core.CvType; 31import org.opencv.core.Mat; 32import org.opencv.core.Point; 33import org.opencv.core.Rect; 34import org.opencv.core.Scalar; 35import org.opencv.imgproc.Imgproc; 36 37import java.nio.ByteBuffer; 38import java.util.concurrent.ExecutorService; 39import java.util.concurrent.Executors; 40 41import static org.opencv.imgproc.Imgproc.medianBlur; 42 43public class MainActivity extends AppCompatActivity { 44 /*** Fixed values ***/ 45 private static final String TAG = "MyApp"; 46 private int REQUEST_CODE_FOR_PERMISSIONS = 1234;; 47 private final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE"}; 48 49 /*** Views ***/ 50 private PreviewView previewView; 51 private ImageView imageView; 52 /*** For CameraX ***/ 53 private Camera camera = null; 54 private Preview preview = null; 55 private ImageAnalysis imageAnalysis = null; 56 private ExecutorService cameraExecutor = Executors.newSingleThreadExecutor(); 57 58 int x; 59 int y; 60 61 static { 62 System.loadLibrary("opencv_java4"); 63 } 64 65 @Override 66 protected void onCreate(Bundle savedInstanceState) { 67 super.onCreate(savedInstanceState); 68 setContentView(R.layout.activity_main); 69 70 previewView = findViewById(R.id.previewView); 71 imageView = findViewById(R.id.imageView); 72 73 if (checkPermissions()) { 74 startCamera(); 75 } else { 76 ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_FOR_PERMISSIONS); 77 } 78 } 79 80 private void startCamera() { 81 final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this); 82 Context context = this; 83 cameraProviderFuture.addListener(new Runnable() { 84 @Override 85 public void run() { 86 try { 87 ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); 88 preview = new Preview.Builder().build(); 89 imageAnalysis = new ImageAnalysis.Builder().build(); 90 imageAnalysis.setAnalyzer(cameraExecutor, new MyImageAnalyzer()); 91 CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build(); 92 93 cameraProvider.unbindAll(); 94 camera = cameraProvider.bindToLifecycle((LifecycleOwner)context, cameraSelector, preview, imageAnalysis); 95 preview.setSurfaceProvider(previewView.createSurfaceProvider(camera.getCameraInfo())); 96 } catch(Exception e) { 97 Log.e(TAG, "[startCamera] Use case binding failed", e); 98 } 99 } 100 }, ContextCompat.getMainExecutor(this)); 101 } 102 103 private class MyImageAnalyzer implements ImageAnalysis.Analyzer { 104 private Mat matPrevious = null; 105 106 @Override 107 public void analyze(@NonNull ImageProxy image) { 108 /* Create cv::mat(RGB888) from image(NV21) */ 109 Mat matOrg = getMatFromImage(image); 110 /* Fix image rotation (it looks image in PreviewView is automatically fixed by CameraX???) */ 111 Mat mat = fixMatRotation(matOrg); 112 medianBlur(mat,mat, 5); 113 //黒とそれ以外に分ける 114 Imgproc.cvtColor(mat,mat, Imgproc.COLOR_RGBA2BGR); 115 Imgproc.cvtColor(mat,mat, Imgproc.COLOR_BGR2HSV); 116 Core.inRange(mat, new Scalar(0,0,0), new Scalar(179,128,100),mat); 117 Imgproc.cvtColor(mat,mat, Imgproc.COLOR_GRAY2BGRA); 118 //任意の領域をトリミングする(黒要素を数えるため) 119 Rect roi = new Rect(10, 10, 100,100); 120 Mat trim = new Mat(mat, roi); 121 //トリミングした範囲でcountNonZeroを行い、int型のxに代入する 122 x = Core.countNonZero(trim); 123 //xを文字列に変換させる(putTextでは文字のみを扱っているため) 124 //他に数値を表示させる方法があれば使わなくても良い 125 String y = String.valueOf(x); 126 //一応ログ出しとく 127 Log.i(TAG, "[analyze] width = " + image.getWidth() + ", height = " + image.getHeight() + "Rotation = " + previewView.getDisplay().getRotation()); 128 Log.i(TAG, "[analyze] mat width = " + matOrg.cols() + ", mat height = " + matOrg.rows()); 129 //どこをトリミングしているか画面を見れば分かるように同じ範囲に線を引く 130 Imgproc.rectangle(mat, new Rect(10, 10, 100, 100), new Scalar(255, 0, 0)); 131 //countNonZeroで数えたxを文字列に変えたyを代入 132 Imgproc.putText(mat, y , new Point(10, 10), 1, 1, new Scalar(255, 0, 0)); 133 /* Convert cv::mat to bitmap for drawing */ 134 Bitmap bitmap = Bitmap.createBitmap(mat.cols(), mat.rows(),Bitmap.Config.ARGB_8888); 135 Utils.matToBitmap(mat, bitmap); 136 137 /* Display the result onto ImageView */ 138 runOnUiThread(new Runnable() { 139 @Override 140 public void run() { 141 imageView.setImageBitmap(bitmap); 142 } 143 }); 144 145 /* Close the image otherwise, this function is not called next time */ 146 image.close(); 147 } 148 private Mat getMatFromImage(ImageProxy image) { 149 /* https://stackoverflow.com/questions/30510928/convert-android-camera2-api-yuv-420-888-to-rgb */ 150 ByteBuffer yBuffer = image.getPlanes()[0].getBuffer(); 151 ByteBuffer uBuffer = image.getPlanes()[1].getBuffer(); 152 ByteBuffer vBuffer = image.getPlanes()[2].getBuffer(); 153 int ySize = yBuffer.remaining(); 154 int uSize = uBuffer.remaining(); 155 int vSize = vBuffer.remaining(); 156 byte[] nv21 = new byte[ySize + uSize + vSize]; 157 yBuffer.get(nv21, 0, ySize); 158 vBuffer.get(nv21, ySize, vSize); 159 uBuffer.get(nv21, ySize + vSize, uSize); 160 Mat yuv = new Mat(image.getHeight() + image.getHeight() / 2, image.getWidth(), CvType.CV_8UC1); 161 yuv.put(0, 0, nv21); 162 Mat mat = new Mat(); 163 Imgproc.cvtColor(yuv, mat, Imgproc.COLOR_YUV2RGB_NV21, 3); 164 return mat; 165 } 166 167 private Mat fixMatRotation(Mat matOrg) { 168 Mat mat; 169 switch (previewView.getDisplay().getRotation()){ 170 default: 171 case Surface.ROTATION_0: 172 mat = new Mat(matOrg.cols(), matOrg.rows(), matOrg.type()); 173 Core.transpose(matOrg, mat); 174 Core.flip(mat, mat, 1); 175 break; 176 case Surface.ROTATION_90: 177 mat = matOrg; 178 break; 179 case Surface.ROTATION_270: 180 mat = matOrg; 181 Core.flip(mat, mat, -1); 182 break; 183 } 184 return mat; 185 } 186 } 187 188 private boolean checkPermissions(){ 189 for(String permission : REQUIRED_PERMISSIONS){ 190 if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){ 191 return false; 192 } 193 } 194 return true; 195 } 196 197 @Override 198 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 199// super.onRequestPermissionsResult(requestCode, permissions, grantResults); 200 if(requestCode == REQUEST_CODE_FOR_PERMISSIONS){ 201 if(checkPermissions()){ 202 startCamera(); 203 } else{ 204 Log.i(TAG, "[onRequestPermissionsResult] Failed to get permissions"); 205 this.finish(); 206 } 207 } 208 } 209}

日本語でコメントを書いているところが現在作成中の範囲になります。

それ以外は映像をスマホに表示したり、映像方向を変換したりするために使っているので
基本的には関係ないとおもっています。

これらのプログラムから
countNonZero部分を排除したものを実行すると以下のような映像が取得できます。
イメージ説明
したの赤い長方形の上部分に0と表示されていますがこれは
はじめにint x = 0;としているためです。

ここに、黒色の割合もしくは黒ピクセル数を表示したいと考えています。

#考えられる問題点
countNonZeroはonCreateの中のstartCamera()に記述しているので
Activity生成時にピクセル数えるのは問題があるということでしょうか?

その場合、どのように記述すれば良いのかを示していただけると大変助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/12/23 06:48

Assertion src.channels() == 1 means that image should have 1 channel, i.e. it has to be gray, not colored. ってことで、画像データを白黒に変換する必要があるかと。 https://stackoverflow.com/questions/31231565/countnonzero-function-gives-an-assertion-error-in-opencv ちなみに、startCamera は onCreate から (Activity 生成時に 呼ばれてますが、そこでは画像が主時できたときの処理を設定しているだけで、MyImageAnalyzer の処理自体は、実際に画像を取得した時に行われます。(ボタンクリックなどのイベントハンドラの処理がボタンを押した時に実行されるのと同様ですね。)
NieR2B

2021/01/04 03:48

返答ありがとうございます。 あれから、Imgproc.cvtColor(mat,mat, Imgproc.COLOR_GRAY2BGRA);の下に Imgproc.threshold(mat,mat,127,255,THRESH_BINARY);を書くことで 画像データを2値化しました。 しかし、Core.countNonZero(mat);を記述するとエラー落ちしていまい問題解決には至りませんでした。
hoshi-takanori

2021/01/04 06:12

LogCat にエラーメッセージは出てませんか?
NieR2B

2021/01/05 04:21 編集

アプリをRunさせてから落ちるまでのLogcatのErrorを抜き出します。 2021-01-05 13:08:09.197 27755-27773/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.208 27755-27781/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.209 27755-27781/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.209 27755-27781/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.220 13718-13720/? E/rutils: releaseProcess gCount = 1 2021-01-05 13:08:09.227 27755-27781/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.350 27755-27782/com.example.line E/libc: Access denied finding property "persist.vendor.camera.privapp.list" 2021-01-05 13:08:09.351 1130-19307/? E/CameraService: can not read file /data/.camera/RUS_camera_hardware_thirdParty. 2021-01-05 13:08:09.358 1130-19307/? E/CameraService: connectHelper: in motor_socket 0 2021-01-05 13:08:09.358 1130-19307/? E/CameraService: can not read rus file 2021-01-05 13:08:09.362 30825-2183/? E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.363 30825-2183/? E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.363 27755-27768/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.364 1130-19307/? E/CameraService: onTorchStatusChangedLocked: cannot get torch status of camera 1: No such file or directory (-2) 2021-01-05 13:08:09.364 1130-19307/? E/CameraService: onTorchStatusChangedLocked: cannot get torch status of camera 2: No such file or directory (-2) 2021-01-05 13:08:09.364 27755-27768/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.365 30825-2183/? E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.366 27755-27768/com.example.line E/libc: Access denied finding property "vendor.camera.aux.packagelist" 2021-01-05 13:08:09.367 826-2118/? E/libc: Access denied finding property "ro.camera.req.fmq.size" 2021-01-05 13:08:09.367 826-2118/? E/libc: Access denied finding property "ro.camera.res.fmq.size" 2021-01-05 13:08:09.522 826-2118/? E/CHIUSECASE: ResetApertureData ResetApertureData 2021-01-05 13:08:09.522 826-2118/? E/CHIUSECASE: ResetApertureData Initialize 2021-01-05 13:08:09.524 826-2118/? E/OPFDManager: m_capMode:0, m_attr_detect_enable:1 2021-01-05 13:08:09.529 826-2118/? E/OPFDManager: m_capMode:0, m_attr_detect_enable:1 2021-01-05 13:08:09.624 826-2118/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.638 4024-4024/? E/PhoneState: iconId is 0android.widget.ImageView{27c5ca8 G.ED..... ......I. 0,0-15,42 #7f0a0115 app:id/data_inout} 2021-01-05 13:08:09.639 4024-4024/? E/PhoneState: iconId is 0android.widget.ImageView{e8e9b54 G.ED..... ......I. 0,0-0,0 #7f0a0115 app:id/data_inout} 2021-01-05 13:08:09.720 1130-19307/? E/Camera3-Device: configureStreams: Stream 0: DataSpace override not allowed for format 0x23 2021-01-05 13:08:09.744 826-1774/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:1, FPS:30.00, (Short, Safe, Long) G (19.199 19.775 19.775) ET (30000000 30000000 30000000) SensCorrF:1.00 2021-01-05 13:08:09.746 826-1774/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.750 826-1770/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:2, FPS:30.00, (Short, Safe, Long) G (19.199 19.775 19.775) ET (30000000 30000000 30000000) SensCorrF:1.00 2021-01-05 13:08:09.751 826-1770/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.753 826-1771/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:3, FPS:30.00, (Short, Safe, Long) G (19.199 19.775 19.775) ET (30000000 30000000 30000000) SensCorrF:1.00 2021-01-05 13:08:09.753 826-1771/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.757 826-1774/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:4, FPS:30.00, (Short, Safe, Long) G (19.199 19.775 19.775) ET (30000000 30000000 30000000) SensCorrF:1.00 2021-01-05 13:08:09.757 826-1774/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.863 826-1770/? E/CamX: [ERROR][STATS_AF] pdlib_sparse_wrapper.cpp:471 pd_process_center_window() raw ==NULL, p_context->flag_lcr 1, p_context->p_input_raw 0x0 2021-01-05 13:08:09.877 826-1770/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:5, FPS:30.00, (Short, Safe, Long) G (20.671 20.671 20.671) ET (30000000 30000000 30000000) SensCorrF:1.00 2021-01-05 13:08:09.887 826-1770/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.896 826-1771/? E/CamX: [ERROR][STATS_AF] pdlib_sparse_wrapper.cpp:471 pd_process_center_window() raw ==NULL, p_context->flag_lcr 1, p_context->p_input_raw 0x0 2021-01-05 13:08:09.914 826-1774/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:6, FPS:30.00, (Short, Safe, Long) G (21.608 21.608 21.608) ET (30000000 30000000 30000000) SensCorrF:1.00 2021-01-05 13:08:09.919 27755-27801/com.example.line E/cv::error(): OpenCV(4.5.0) Error: Assertion failed (cn == 1) in countNonZero, file /build/master_pack-android/opencv/modules/core/src/count_non_zero.dispatch.cpp, line 130 2021-01-05 13:08:09.920 27755-27801/com.example.line E/org.opencv.core: core::countNonZero_10() caught cv::Exception: OpenCV(4.5.0) /build/master_pack-android/opencv/modules/core/src/count_non_zero.dispatch.cpp:130: error: (-215:Assertion failed) cn == 1 in function 'countNonZero' 2021-01-05 13:08:09.923 27755-27801/com.example.line E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1 Process: com.example.line, PID: 27755 CvException [org.opencv.core.CvException: cv::Exception: OpenCV(4.5.0) /build/master_pack-android/opencv/modules/core/src/count_non_zero.dispatch.cpp:130: error: (-215:Assertion failed) cn == 1 in function 'countNonZero' ] at org.opencv.core.Core.countNonZero_0(Native Method) at org.opencv.core.Core.countNonZero(Core.java:1294) at com.example.line.MainActivity$MyImageAnalyzer.analyze(MainActivity.java:124) at androidx.camera.core.ImageAnalysisAbstractAnalyzer.lambda$analyzeImage$0$ImageAnalysisAbstractAnalyzer(ImageAnalysisAbstractAnalyzer.java:87) at androidx.camera.core.-$$Lambda$ImageAnalysisAbstractAnalyzer$V6Gtux2-h8spda8vf4wFnIZntYI.run(Unknown Source:8) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) 2021-01-05 13:08:09.929 826-1771/? E/CamX: [ERROR][STATS_AF] pdlib_sparse_wrapper.cpp:471 pd_process_center_window() raw ==NULL, p_context->flag_lcr 1, p_context->p_input_raw 0x0 2021-01-05 13:08:09.932 826-1774/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.951 826-1771/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:7, FPS:30.00, (Short, Safe, Long) G (22.588 22.588 22.588) ET (30000000 30000000 30000000) SensCorrF:1.00 2021-01-05 13:08:09.962 826-1771/? E/libc: Access denied finding property "gsm.operator.numeric" 2021-01-05 13:08:09.963 826-1774/? E/CamX: [ERROR][STATS_AF] pdlib_sparse_wrapper.cpp:471 pd_process_center_window() raw ==NULL, p_context->flag_lcr 1, p_context->p_input_raw 0x0 2021-01-05 13:08:09.983 826-1772/? E/mm-camera-CORE: ArbitOut:CID:0,Frame:8, FPS:30.00, (Short, Safe, Long) G (22.588 22.588 22.588) ET (30000000 30000000 30000000) SensCorrF:1.00 以上です。 ↓↓この文が他と違う記述だったので何か関係があるのでしょうか?↓↓ 2021-01-05 13:08:09.923 27755-27801/com.example.line E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1 Process: com.example.line, PID: 27755 CvException [org.opencv.core.CvException: cv::Exception: OpenCV(4.5.0) /build/master_pack-android/opencv/modules/core/src/count_non_zero.dispatch.cpp:130: error: (-215:Assertion failed) cn == 1 in function 'countNonZero' ] at org.opencv.core.Core.countNonZero_0(Native Method) at org.opencv.core.Core.countNonZero(Core.java:1294) at com.example.line.MainActivity$MyImageAnalyzer.analyze(MainActivity.java:124) at androidx.camera.core.ImageAnalysisAbstractAnalyzer.lambda$analyzeImage$0$ImageAnalysisAbstractAnalyzer(ImageAnalysisAbstractAnalyzer.java:87) at androidx.camera.core.-$$Lambda$ImageAnalysisAbstractAnalyzer$V6Gtux2-h8spda8vf4wFnIZntYI.run(Unknown Source:8) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) 無駄なところまで書き出している可能性があります。 Logcatはあまり理解が出来ていないので何卒ご教授ください。
hoshi-takanori

2021/01/05 07:25

Core.inRange の結果がすでに白黒のようなので、次の Imgproc.cvtColor(mat,mat, Imgproc.COLOR_GRAY2BGRA); が不要かもです。
NieR2B

2021/01/06 01:24

出来ました!! 白黒データになったのをグレースケル化していたので映像は白黒なのにcountNonZero出来ない という事態がおきていたようです。 Core.inRange(mat, new Scalar(0,0,0), new Scalar(179,128,100),mat); Rect roi = new Rect(100, 100, 100,100); Mat trim = new Mat(mat, roi); int x = Core.countNonZero(trim); これで指定した領域の黒ピクセルを数えることが出来ました。 >hoshi-takanoriさん ベストアンサーに選びたいので回答の方に何か書いてもらえませんか?
guest

回答1

0

ベストアンサー

Core.inRange で白黒 2 値化したものをわざわざ BGRA にしてから Core.countNonZero を呼んでますが、Core.countNonZero の入力は白黒 (グレー?) なので、BGRA にする必要はないようです。

diff

1 Core.inRange(mat, new Scalar(0,0,0), new Scalar(179,128,100),mat); 2- Imgproc.cvtColor(mat,mat, Imgproc.COLOR_GRAY2BGRA); 3 //任意の領域をトリミングする(黒要素を数えるため) 4 Rect roi = new Rect(10, 10, 100,100); 5 Mat trim = new Mat(mat, roi); 6 //トリミングした範囲でcountNonZeroを行い、int型のxに代入する 7 x = Core.countNonZero(trim);

ちなみに、Core.inRange のドキュメント には

That is, dst (I) is set to 255 (all 1 -bits) if src (I) is within the specified 1D, 2D, 3D, ... box and 0 otherwise.

dst - output array of the same size as src and CV_8U type.

とありますので、結果は CV_8U (= CV_8UC1) つまり符号なし 8 ビット * 1 チャンネル (値は 0 か 255) になり、Core.countNonZero のドキュメント には

src - single-channel array. SEE: mean, meanStdDev, norm, minMaxLoc, calcCovarMatrix

とあるので 1 チャンネル (白黒 or グレー) の値を期待していることになりますが、Imgproc.COLOR_GRAY2BGRA していたのでその結果は 4 チャンネルになってたはず。

参考: cv::Matの基本処理 - OpenCV-CookBook

投稿2021/01/06 02:05

hoshi-takanori

総合スコア7899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NieR2B

2021/01/06 02:11

詳しい解説ありがとうございます。 これでまた一歩先に進むことが出来ます(^_^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問