質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
OpenCV

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

Java

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

Android Studio

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

Q&A

解決済

1回答

3905閲覧

テンプレートマッチングを行おうとしたところエラーがでました。解決法を教えてください。

tomoe

総合スコア12

OpenCV

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

Java

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

Android Studio

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

0グッド

0クリップ

投稿2016/11/14 07:46

###前提・実現したいこと
下記のエラー分を解決しテンプレートマッチングを行いたいです。
コード多くなってしまいますがよろしくお願いします<(_ _)>
###発生している問題・エラーメッセージ

E/AndroidRuntime: FATAL EXCEPTION: Thread-411 Process: com.example.tomoe.opencvcamera, PID: 23208 CvException [org.opencv.core.CvException: cv::Exception: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/core/src/matrix.cpp:116: error: (-215) s >= 0 in function void cv::setSize(cv::Mat&, int, int const*, const size_t*, bool) ] at org.opencv.core.Mat.n_Mat(Native Method) at org.opencv.core.Mat.<init>(Mat.java:477) at com.example.tomoe.opencvcamera.MatchingDemo.run(MatchingDemo.java:44) at com.example.tomoe.opencvcamera.TemplateMatching.main(TemplateMatching.java:30) at com.example.tomoe.opencvcamera.MainActivity.onCameraFrame(MainActivity.java:161) at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387) at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:346) at java.lang.Thread.run(Thread.java:818)

###該当のソースコード
MainActivity.java

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { private static String TAG = "MainActivity"; JavaCameraView javacameraview; Mat mOutputFrame;//出力画像 Mat mOutputFrame2;//画像保持用 Mat mOutputFrame3;//画像保持用 Mat mat; Bitmap temp; int touId = 0;//フラグ変数 Bitmap src;//テンプレート画像の読み込み(jpg) private Camera camera; Bitmap dst; Mat img; BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { //読み込み完了したらカメラビューを開始する case BaseLoaderCallback.SUCCESS: { javacameraview.enableView(); break; } default: { super.onManagerConnected(status); break; } } } }; //OpenCVが読込できてるかログ確認用 static { if (OpenCVLoader.initDebug()) { Log.i(TAG, "Opencv loaded successfully"); } else { Log.i(TAG, "OpenCV not loaded"); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); javacameraview = (JavaCameraView) findViewById(R.id.java_camera_view); javacameraview.setVisibility(SurfaceView.VISIBLE); javacameraview.setCvCameraViewListener(this); //画像をbitmapに変換 temp = BitmapFactory.decodeResource( getResources(),R.drawable.test2); } @Override protected void onPause() { super.onPause(); if (javacameraview != null) javacameraview.disableView(); } @Override protected void onDestroy() { super.onDestroy(); if (javacameraview != null) javacameraview.disableView(); } @Override protected void onResume() { super.onResume(); if (OpenCVLoader.initDebug()) { Log.i(TAG, "Opencv loaded successfully"); mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS); } else { Log.i(TAG, "OpenCV not loaded"); //OpenCVLibraryの読み込み OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this, mLoaderCallBack); } } @Override public void onCameraViewStarted(int width, int height) { mOutputFrame = new Mat(height, width, CvType.CV_8UC1); } @Override public void onCameraViewStopped() { mOutputFrame.release(); } @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame ) { switch (touId) { case 0: mOutputFrame = inputFrame.rgba(); //Log.d("OutputFrame","0 "+mOutputFrame); break; case 1: //画像保存できるか? /* mOutputFrame3 = */Imgproc.threshold(inputFrame.gray(), mOutputFrame, 127.0, 255.0, Imgproc.THRESH_BINARY);//二値化 mOutputFrame2 = mOutputFrame; Log.d("OutputFrame","1 "+mOutputFrame); Log.d("OutputFrame2","2 "+mOutputFrame2); // Log.d("OutputFrame2","2 "+mat.data); //(Mat型をbitmap型に変換 dst = Bitmap.createBitmap(mOutputFrame.width(), mOutputFrame.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(mOutputFrame, dst); Log.d("Mat-Bitmap","完了"); Bitmap args[] = {dst,temp}; TemplateMatching.main(dst, temp, "C:/Users/ide/AndroidStudioProjects/OpencvCamera/app/src/main/res/drawable/outfile/output.bmp"); touId = 2; break; case 2: mOutputFrame = mOutputFrame2; break; } return mOutputFrame; } //追加分 @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: //画面がタッチされたときの動作 if (touId == 0) { touId = 1; } else if (touId == 2) { touId = 0; } break; case MotionEvent.ACTION_CANCEL: //他の要因によってタッチがキャンセルされたときの動作 break; } return super.onTouchEvent(ev); } }

MatchingDemo.java

import android.graphics.Bitmap; import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; /** * Created by ide on 2016/11/03. */ public class MatchingDemo { private Mat img; private Mat templ; private Mat result; public MatchingDemo(){ } public void run(Bitmap inFile, Bitmap templateFile, String outFile, int match_method) { System.out.println("\nRunning Template Matching"); img = new Mat(inFile.getHeight(), templateFile.getWidth(), CvType.CV_8UC1); templ = new Mat(templateFile.getHeight(), templateFile.getWidth(), CvType.CV_8UC1); Utils.bitmapToMat(inFile, img); Utils.bitmapToMat(templateFile, templ); // Create the result matrix int result_cols = img.cols() - templ.cols() + 1; int result_rows = img.rows() - templ.rows() + 1; result = new Mat(result_rows, result_cols, CvType.CV_32FC1); // Do the Matching and Normalize Imgproc.matchTemplate(img, templ, result, match_method); Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat()); // / Localizing the best match with minMaxLoc Core.MinMaxLocResult mmr = Core.minMaxLoc(result); Point matchLoc; if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { matchLoc = mmr.minLoc; } else { matchLoc = mmr.maxLoc; } // / Show me what you got Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(), matchLoc.y + templ.rows()), new Scalar(0, 255, 0)); // Save the visualized detection. System.out.println("Writing "+ outFile); Highgui.imwrite(outFile, img); } }

TemplateMatching.java

import android.graphics.Bitmap; import android.util.Log; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; /** * Created by ide on 2016/11/03. */ public class TemplateMatching { // public static void main(String[] args) { public static void main(Bitmap dst, Bitmap temp, String outFile) { Log.d("tem_match","Library_start"); try{ System.loadLibrary("opencv_java"); Log.d("tem_match","Library_end"); }catch(Exception e){ Log.d("tem_match","Library_error"); } MatchingDemo match = new MatchingDemo(); Log.d("match","new_end"); match.run(dst, temp, outFile, Imgproc.TM_CCOEFF); Log.d("match","run_end"); } }

###補足情報(言語/FW/ツール等のバージョンなど)
Androidstudio2.2.1
OpenCV for android 2.4.11
実機ASUS Nexus7 (android6.0.1,API23)

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

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

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

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

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

MasahikoHirata

2016/11/14 08:57

エラー内容を見ると、モジュール内部ですね。まずは映像がちゃんと読まれているか?の部分まで動きますか?
tomoe

2016/11/15 08:18

遅くなりましたm(__)m Logを作って確認してみたところtempの画像データが public Mat onCameraFrameまで来ていませんでした。tempを作ってる位置が悪いのでしょうか?
tomoe

2016/11/15 08:41

TemplateMatching.mainをコメント化すると動きますが、コメント化しないとタッチ時にアプリが落ちてしまいます。
MasahikoHirata

2016/11/17 00:28

’ MatchingDemo match = new MatchingDemo();’の所にブレークポイントを設定して、ここまで来ますか?
tomoe

2016/11/17 01:20

ブレイクポイントを設定しまくってみました。MatchingDemo match = new MatchingDemo();まで問題なく行き、MatchingDemo.javaの44行目のresultのところで落ちてるみたいです。これはrowとcolosが-になっているせいなんでしょうか? https://gyazo.com/1124c60a1118d506606c1ff05c74fb4e
tomoe

2016/11/17 02:34

テンプレート画像が大きすぎたようでした。画像を差し替えたところ問題なく進むことができましたが、MatchingDemo.javaの61行目Point matchLoc;に✖がついてしまいました。一応アプリは落ちることなく動作しています。 https://gyazo.com/4527459c3b340de397da85aa6776374c
MasahikoHirata

2016/11/17 02:39

それは何よりです。そうですね。テンプレートは適正でなければマッチングにも時間がかかる可能性が。(マッチングも馬鹿じゃないから途中でAbortするけど)
tomoe

2016/11/17 02:48

ありがとうございます。MatchingDemo.javaの61行目Point matchLoc;のところはimgの画像データにtempの画像データがありマッチングしたときに動作するのでしょうか? 後ベストアンサーにさせていただきたいので下の解決法に何か書いていただけると幸いですm(__)m
guest

回答1

0

ベストアンサー

情報の修正・追加依頼の続きとして記載します。
’MatchingDemo.javaの61行目Point matchLoc;のところはimgの画像データにtempの画像データがありマッチングしたときに動作するのでしょうか?’-
これについての詳しい説明は本家のHP
Template Matchingに記載されていますが、マッチングしたときのマッチングの最大値と最小値を返します。マッチングのMETHODにより動作が異なりますが

if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { matchLoc = mmr.minLoc; } else { matchLoc = mmr.maxLoc; }

それでベストマッチがわかるようになっています。
javaではこの関数をjavaで使いやすいようにラップされた関数から読んでいます。

投稿2016/11/17 03:00

MasahikoHirata

総合スコア3747

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

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

tomoe

2016/11/17 03:06

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問