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

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

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

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

Java

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

Android Studio

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

Q&A

1回答

1969閲覧

テンプレートマッチング時のエラーについて教えてくださいm(__)m

tomoe

総合スコア12

OpenCV

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

Java

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

Android Studio

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

0グッド

0クリップ

投稿2016/11/25 05:54

編集2016/12/14 09:49

以前質問をし、エラーが解決しましたがうまくテンプレートマッチングが行えません。
デバックでみたところ49行目の"Point matchLoc;"で✖がついてしまいます・・・
原因がわかる方がいましたら助けてくださいm(__)m

###発生している問題・エラーメッセージ
https://gyazo.com/23e22fe3c124a477959e49a096637cbf
gyazoで申し訳ありませんがデバック時の様子を載せてます。

###該当のソースコード

MainActivity.java

1public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { 2 3 private static String TAG = "MainActivity"; 4 JavaCameraView javacameraview; 5 Mat mOutputFrame;//出力画像 6 Mat mOutputFrame2;//画像保持用 7 Bitmap temp; 8 int touId = 0;//フラグ変数 9 public Mat result; 10 Bitmap dst; 11 12 13 14 BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) { 15 16 @Override 17 public void onManagerConnected(int status) { 18 switch (status) { 19 //読み込み完了したらカメラビューを開始する 20 case BaseLoaderCallback.SUCCESS: { 21 javacameraview.enableView(); 22 break; 23 } 24 default: { 25 super.onManagerConnected(status); 26 break; 27 } 28 } 29 30 } 31 }; 32 33 //OpenCVが読込できてるかログ確認用 34 static { 35 if (OpenCVLoader.initDebug()) { 36 Log.i(TAG, "Opencv loaded successfully"); 37 } else { 38 Log.i(TAG, "OpenCV not loaded"); 39 } 40 } 41 42 @Override 43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 setContentView(R.layout.activity_main); 46 javacameraview = (JavaCameraView) findViewById(R.id.java_camera_view); 47 javacameraview.setVisibility(SurfaceView.VISIBLE); 48 javacameraview.setCvCameraViewListener(this); 49 //画像をbitmapに変換 50 temp = BitmapFactory.decodeResource(getResources(), R.drawable.manzu1); 51 52 } 53 54 @Override 55 protected void onPause() { 56 super.onPause(); 57 if (javacameraview != null) 58 javacameraview.disableView(); 59 } 60 61 @Override 62 protected void onDestroy() { 63 super.onDestroy(); 64 if (javacameraview != null) 65 javacameraview.disableView(); 66 } 67 68 @Override 69 protected void onResume() { 70 super.onResume(); 71 if (OpenCVLoader.initDebug()) { 72 Log.i(TAG, "Opencv loaded successfully"); 73 mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS); 74 75 } else { 76 Log.i(TAG, "OpenCV not loaded"); 77 //OpenCVLibraryの読み込み 78 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this, mLoaderCallBack); 79 } 80 } 81 82 83 @Override 84 public void onCameraViewStarted(int width, int height) { 85 mOutputFrame = new Mat(height, width, CvType.CV_8UC1); 86 } 87 88 @Override 89 public void onCameraViewStopped() { 90 mOutputFrame.release(); 91 } 92 93 @Override 94 public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 95 switch (touId) { 96 case 0: 97 mOutputFrame = inputFrame.rgba(); 98 break; 99 case 1: 100 Imgproc.threshold(inputFrame.gray(), mOutputFrame, 75.0, 255.0, Imgproc.THRESH_BINARY);//二値化 101 mOutputFrame2 = mOutputFrame; 102 Log.d("OutputFrame", "1 " + mOutputFrame); 103 Log.d("OutputFrame2", "2 " + mOutputFrame2); 104 mImageView.setImageBitmap(temp); 105 106 //(Mat型をbitmap型に変換 107 dst = Bitmap.createBitmap(mOutputFrame2.width(), mOutputFrame2.height(), Bitmap.Config.ARGB_8888); 108 Utils.matToBitmap(mOutputFrame2, dst); 109 Log.d("Mat-Bitmap", "完了"); 110 Log.d("dst", "1" + this.dst); 111 Log.d("temp", "2" + this.temp); 112 113 //変更1(this追加) 2016/12/14 114 TemplateMatching.main(dst, temp, "c:/Users/Public/Pictures/dst.png", this); 115 116 117 //アプリが落ちる 118 ImageView imageView = (ImageView) findViewById(R.id.image); 119 imageView.setImageBitmap(dst); 120 121 touId = 2; 122 break; 123 case 2: 124 125 mOutputFrame = mOutputFrame2; 126 break; 127 } 128 129 return mOutputFrame; 130 } 131 132 //追加分 133 @Override 134 public boolean onTouchEvent(MotionEvent ev) { 135 switch (ev.getAction()) { 136 case MotionEvent.ACTION_DOWN: 137 //画面がタッチされたときの動作 138 if (touId == 0) { 139 touId = 1; 140 } else if (touId == 2) { 141 touId = 0; 142 } 143 break; 144 case MotionEvent.ACTION_CANCEL: 145 //他の要因によってタッチがキャンセルされたときの動作 146 break; 147 } 148 return super.onTouchEvent(ev); 149 } 150} 151

TemplateMatching.java

TemplateMatching.java

1//変更点2 (MainActivity actを追加)2016/12/14 2 3public class TemplateMatching { 4 public static void main(Bitmap dst, Bitmap temp, String outFile, MainActivity act) { 5 Log.d("tem_match","Library_start"); 6 try{ 7 System.loadLibrary("opencv_java"); 8 Log.d("tem_match","Library_end"); 9 }catch(Exception e){ 10 Log.d("tem_match","Library_error"); 11 } 12 new MatchingDemo().run(dst, temp, outFile, Imgproc.TM_CCOEFF, act); 13 14}

MachingDemo.java

MachingDemo.java

1public class MatchingDemo { 2 private Mat img; 3 private Mat templ; 4 private Mat result; 5 public Bitmap dst2; 6 7 8 public MatchingDemo() { 9 } 10 11 //変更点3 (MainActivity actを追加)2016/12/14 12 public void run(Bitmap inFile, Bitmap templateFile, String outFile, int match_method, MainActivity act) { 13 System.out.println("\nRunning Template Matching"); 14 15 img = new Mat(inFile.getHeight(), inFile.getWidth(), CvType.CV_8UC1); 16 templ = new Mat(templateFile.getHeight(), templateFile.getWidth(), CvType.CV_8UC1); 17 Utils.bitmapToMat(inFile, img); 18 Utils.bitmapToMat(templateFile, templ); 19 20 //結果を作成 21 int result_cols = img.cols() - templ.cols() + 1; 22 int result_rows = img.rows() - templ.rows() + 1; 23 result = new Mat(result_rows, result_cols, CvType.CV_32FC1); 24 25 26 // 正規化とマッチングを行う 27 Imgproc.matchTemplate(img, templ, result, match_method); 28 Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat()); 29 30 //閾値が最も高いものを選ぶ 31 Core.MinMaxLocResult mmr = Core.minMaxLoc(result); 32 //マッチング時の最大値と最小値を返す 33 Point matchLoc; 34 if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { 35 matchLoc = mmr.minLoc; 36 } else { 37 matchLoc = mmr.maxLoc; 38 } 39 40 //マッチしたところを囲む 41 Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(), 42 matchLoc.y + templ.rows()), new Scalar(0, 255, 0)); 43 44 //(Mat型をbitmap型に変換 45 dst2 = Bitmap.createBitmap(img.width(), img.height(), Bitmap.Config.ARGB_8888); 46 Utils.matToBitmap(img, dst2); 47 act.dst = dst2; 48 49 50 } 51} 52

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

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

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

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

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

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

MasahikoHirata

2016/11/25 06:22

'Point matchLoc;'を'Point matchLoc=new Point();'では?
MasahikoHirata

2016/11/25 07:07

'import org.opencv.core.Point;'してますよね?
tomoe

2016/11/25 07:16

してありました。
MasahikoHirata

2016/11/25 09:42

"Point matchLoc; if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { matchLoc = mmr.minLoc; } else { matchLoc = mmr.maxLoc; }"を” if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { Point matchLoc = mmr.minLoc; } else { Point matchLoc = mmr.maxLoc; }"にするのは?
MasahikoHirata

2016/11/25 13:39

他に原因があるかもしれませんが、元の形に戻して'Point matchLoc;'を'Point matchLoc=new Point(0,0);'では?
MasahikoHirata

2016/11/25 14:24

' public void run(Bitmap inFile, Bitmap templateFile, String outFile, int match_method) {nRunning Template Matching");'の’nRunning Template Matching");’とは?
tomoe

2016/11/25 14:52

サンプルの中にあったものをそのまま持ってきて変えた物なので私もよくわからないですが、 System.out.println()の中なのでログ出力のようなものと考えてます。
MasahikoHirata

2016/11/26 02:33

では’public void run(Bitmap inFile, Bitmap templateFile, String outFile, int match_method) {nRunning Template Matching");'の’nRunning Template Matching");’を’public void run(String inFile, String templateFile, String outFile, int match_method) { System.out.println("\nRunning Template Matching");’に変更してみましょう。
tomoe

2016/11/26 02:40 編集

inFile,templateFileがBitMap型なのでエラー吐いてしまいます。MainActivity.javaで2値化した画像をdst = inFIle,テンプレート画像をtemp = templateFileとしてますがString型に変えるにはどのようにすればいいでしょうか
MasahikoHirata

2016/11/26 03:05

'public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame ) {'の中で作製した映像を一時適当なファイル名で’ Highgui.imwrite’で書き出し、そのファイル名を渡す。そして'run'中でimread'で呼び出すのでは?
tomoe

2016/11/26 03:45

Highgui.imwrite(mOutputFrame,◯◯);の◯◯の一時適当なファイル名はどのように入れればいいんでしょうか 適当な空の変数ではないですよね
MasahikoHirata

2016/11/26 04:01

’imwrite(mOutputFrame,◯◯);’で’自分の好きなファイル名,イメージデータ格納先’をセットする。例えばimwrite("TempImg.png",mOutputFrame);'とか。そしてそのファイル名を渡せば。渡されたらその中でimreadすれば
tomoe

2016/11/26 04:03

ありがとうございます!早速試してみます
MasahikoHirata

2016/11/26 04:16

まずバグを作らない事を考えると、確実に値が渡る方法。例えばビットマップファイルなどではファイル構造で縦横のピクセルなどが定義されているからこの方法を考えました。(他に方法があるとは思いますが)試している(勉強している)時は逆にエラーが出ると’この方法は何かが間違っている、なぜだ?’と経験するのが本や質問サイトで考え方(思考過程)を飛び抜かして(その条件では)動いた動いたになってしまいます。それでとりあえずファイル渡しで。
tomoe

2016/11/26 04:50

申し訳ありません 自宅のPCの調子が可笑しくなってしまったので大学にて引き続きやろうと思いますが、少々時間がかかってしまいます・・・ また夕方くらいにお時間あれば教えていただけると幸いですm(_ _)m
tomoe

2016/11/26 07:32

imwrite("dst.bmp",mOutputFrame);で撮った画像をdst.bmpに変換。temp = BitmapFactory.decodeResource( getResources(),R.drawable.manzu1); Utils.bitmapToMat(temp,mtemp); imwrite("TempImg.bmp",mtemp); tempをMat型に変換後さらにString型のTempImg.bmpに変換しました。 runはMatchingDemo.javaのrunのことで良いのでしょうか? MainActivity.java→TemplateMatching/java→MatchingDemo.javaの順で動いてるはずなのでTemplateMatching.javaを飛ばしてしまいます。 回答欄ですと```でプログラム書きやすいと思うで続きはそちらでお願いしたいですm(__)m
MasahikoHirata

2016/11/26 07:47

’TemplateMatching/java→MatchingDemo.javaの順’になるように渡しましょう。
tomoe

2016/11/26 08:16

申し訳ありません。自分なりに調べましたがどの様にすればいいか分かりませんでした。  質問のコードを現在のものに変更しました。
guest

回答1

0

public class MatchingDemo { private Mat img; private Mat templ; private Mat result; public MatchingDemo() { } // public void run(String inFile, String templateFile, String outFile, int match_method) { System.out.println("\nRunning Template Matching"); Mat img = Highgui.imread(inFile); Mat templ = Highgui.imread(templateFile); //結果を作成 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()); //閾値が最も高いものを選ぶ 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; } //マッチしたところを囲む Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(), matchLoc.y + templ.rows()), new Scalar(0, 255, 0)); // 結果を保存 System.out.println("Writing "+ outFile); Highgui.imwrite(outFile, img); } }

を渡されたファイル名で'img’や'templ'に'imread'すれば映像は渡るのでは?

投稿2016/11/26 08:23

編集2016/11/27 02:26
MasahikoHirata

総合スコア3747

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

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

tomoe

2016/11/26 08:42

``` Mat img = Highgui.imread("dst.bmp"); Mat templ = Highgui.imread("TempImg.bmp"); ``` こうでしょうか
MasahikoHirata

2016/11/26 08:51

はい。これで先に保存していたイメージが楽に渡ると思いますが。また途中で'imshow'すればデータの確認も視覚的にしやすくなったと思います。
tomoe

2016/11/26 08:54

申し訳ありません 部屋を閉めるそうなので続きは明日になります。 本日は長い間ありがとうございましたm(__)m
MasahikoHirata

2016/11/27 02:04 編集

チャットではありませんので手短に。勉強ですので焦らず、いきなり答えでは得るものが少ないと考えます。間違いの数がノウハウに反映できると思います。まずは処理とデータの流れを整理されてみてください。私なりに回答も考えますので。どこが問題なのかの思考過程は今後に生きます。恐らく、今までの流れでは二値化したデータでのマッチングをJavaで行いたい(習得したい)流れと理解していますので。
tomoe

2016/11/27 02:57 編集

確認できました。
MasahikoHirata

2016/11/27 02:27

回答を修正しました。机上ですのでチェックしていませんが。それとリクエストの件、メッセージしましたのでご確認下さい。また直前のコメントも修正で。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問