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

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

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

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

Java

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

Android Studio

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

受付中

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

tomoe
tomoe

総合スコア12

OpenCV

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

Java

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

Android Studio

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

1回答

0評価

0クリップ

1768閲覧

投稿2016/11/25 05:54

編集2022/01/12 10:55

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

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

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

MainActivity.java

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { private static String TAG = "MainActivity"; JavaCameraView javacameraview; Mat mOutputFrame;//出力画像 Mat mOutputFrame2;//画像保持用 Bitmap temp; int touId = 0;//フラグ変数 public Mat result; Bitmap dst; 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.manzu1); } @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(); break; case 1: Imgproc.threshold(inputFrame.gray(), mOutputFrame, 75.0, 255.0, Imgproc.THRESH_BINARY);//二値化 mOutputFrame2 = mOutputFrame; Log.d("OutputFrame", "1 " + mOutputFrame); Log.d("OutputFrame2", "2 " + mOutputFrame2); mImageView.setImageBitmap(temp); //(Mat型をbitmap型に変換 dst = Bitmap.createBitmap(mOutputFrame2.width(), mOutputFrame2.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(mOutputFrame2, dst); Log.d("Mat-Bitmap", "完了"); Log.d("dst", "1" + this.dst); Log.d("temp", "2" + this.temp); //変更1(this追加) 2016/12/14 TemplateMatching.main(dst, temp, "c:/Users/Public/Pictures/dst.png", this); //アプリが落ちる ImageView imageView = (ImageView) findViewById(R.id.image); imageView.setImageBitmap(dst); 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); } }

TemplateMatching.java

TemplateMatching.java

//変更点2 (MainActivity actを追加)2016/12/14 public class TemplateMatching { public static void main(Bitmap dst, Bitmap temp, String outFile, MainActivity act) { 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"); } new MatchingDemo().run(dst, temp, outFile, Imgproc.TM_CCOEFF, act); }

MachingDemo.java

MachingDemo.java

public class MatchingDemo { private Mat img; private Mat templ; private Mat result; public Bitmap dst2; public MatchingDemo() { } //変更点3 (MainActivity actを追加)2016/12/14 public void run(Bitmap inFile, Bitmap templateFile, String outFile, int match_method, MainActivity act) { System.out.println("\nRunning Template Matching"); img = new Mat(inFile.getHeight(), inFile.getWidth(), CvType.CV_8UC1); templ = new Mat(templateFile.getHeight(), templateFile.getWidth(), CvType.CV_8UC1); Utils.bitmapToMat(inFile, img); Utils.bitmapToMat(templateFile, templ); //結果を作成 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); // 正規化とマッチングを行う 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)); //(Mat型をbitmap型に変換 dst2 = Bitmap.createBitmap(img.width(), img.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(img, dst2); act.dst = dst2; } }

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Java

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

Android Studio

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