Q&A
###前提・実現したいこと
androidstudioとOpenCVを使って色抽出とテンプレートマッチングを組み合わせて
赤い丸を探すプログラムを開発しています。
実現したい事としては
マッチングする対象の画像は画面に表示されている「m_temp」で
それをandroidstudio内のsrcフォルダのdrawableに入っている画像とマッチングをしたいです。
###発生している問題・エラーメッセージ
こちらのサイト「OpenCVのテンプレートマッチングで複数検出」を参考に記述したところ
コード内にはエラーは出ていなかったのですが実行するとエラーが発生し、
実機の動作としてはマッチングの直前(画面をタッチすると)で落ちてしまいます。
テンプレートマッチングはまだ勉強を始めたばかりなので具体的に教えて頂きたいです。
FATAL EXCEPTION: Thread-3 Process: com.example.color2, PID: 6904 CvException [org.opencv.core.CvException: cv::Exception: /build/master_pack-android/opencv/modules/imgproc/src/templmatch.cpp:664: error: (-215) corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1 in function void cv::crossCorr(const cv::Mat&, const cv::Mat&, cv::Mat&, cv::Size, int, cv::Point, double, int) ] at org.opencv.imgproc.Imgproc.matchTemplate_1(Native Method) at org.opencv.imgproc.Imgproc.matchTemplate(Imgproc.java:2452) at com.example.color2.MainActivity.onCameraFrame(MainActivity.java:162) at org.opencv.android.CameraBridgeViewBase$CvCameraViewListenerAdapter.onCameraFrame(CameraBridgeViewBase.java:163) at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:399) at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:352) at java.lang.Thread.run(Thread.java:776)
###該当のソースコード
Java
1private Mat m_temp; //抽出結果の画像 2 3 public Mat onCameraFrame(Mat inputFrame) { 4 Mat src = inputFrame; 5 Mat dst = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U); 6 Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV); 7 //赤ボールペンならこのあたり 紫っぽい暗い赤ならこんな感じ *オレンジは反応しない 8 Mat src2 = dst; 9 Mat dst2 = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U); 10 Scalar low = new Scalar(165, 20, 30);//下限 変更前(10,20,30) S,Vはあまり変えない方が良い? 11 Scalar high = new Scalar(179, 255, 255);//上限 変更前(179,255,255) 12 Core.inRange(src2, low, high, dst2);//色抽出 13 // return dst2; }} ←色だけならここ 14 15 //画面をタッチすると表示画面が保持される 16 if (touId > 1) { 17 //return m_temp; // 保持した画像を代わりに表示する。画像は変化しないので、以降の処理は必要ない 18 19 20 21 //対象画像とテンプレート画像を読み込み 22 Mat img = m_temp; 23 Mat tmpl = Imgcodecs.imread("./circle.png"); 24 25 //比較結果を格納するMatを生成 26 Mat result = new Mat(img.rows() - tmpl.rows() + 1, img.cols() - tmpl.cols() + 1, CvType.CV_32FC1); 27 28 Imgproc.matchTemplate(img, tmpl, result, Imgproc.TM_CCOEFF_NORMED); //テンプレートマッチング 29 Imgproc.threshold(result, result, 0.8, 1.0, Imgproc.THRESH_TOZERO); // 検出結果から相関係数がしきい値以下の部分を削除 30 // テンプレート画像の部分を元画像に赤色の矩形で囲む 31 for (int i=0;i<result.rows();i++) { 32 for (int j=0;j<result.cols();j++) { 33 if (result.get(i, j)[0] > 0) { 34 Imgproc.rectangle(img, new Point(j, i), new Point(j + tmpl.cols(), i + tmpl.rows()), new Scalar(0, 0, 255)); 35 } 36 } 37 } 38 System.out.println("output test.jpg"); 39 Imgcodecs.imwrite("test.jpg", img); //画像の出力 40 } 41 42 if (touId == 1) { 43 touId++; 44 m_temp = dst2; //抽出結果を保持する 45 } 46 return dst2; 47 } 48 //タッチが2回でreturnを止めたいが、ifの外にreturnが無いからエラーが出る 49 50 @Override 51 public boolean onTouchEvent(MotionEvent ev) { 52 switch (ev.getAction()) { 53 case ACTION_DOWN: 54 //画面がタッチされたときの動作 55 if (touId == 0) { 56 touId = 1; 57 } 58 break; 59 case MotionEvent.ACTION_CANCEL: 60 //他の要因によってタッチがキャンセルされたときの動作 61 break; 62 } 63 return super.onTouchEvent(ev); 64 }
###試したこと
エラー箇所をさがしてみると、画像の読み込みの部分が上手く動いていないようでした。
ですがどのように直せばよいのか分からないです。
###補足情報(言語/FW/ツール等のバージョンなど)
androidstudio 2.3.1
java
OpenCV 3.0.0
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2017/11/09 14:50
2017/11/09 15:09
2017/11/13 03:44
2017/11/14 06:25
2017/11/14 06:26
2017/11/14 06:35 編集
2017/11/14 06:37
2017/11/14 06:57
2017/11/14 07:18
2017/11/14 08:22
2017/11/14 08:26
2017/11/14 09:02 編集