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

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

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

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

Java

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

Android Studio

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

Q&A

解決済

1回答

1842閲覧

OpenCVを使ったテンプレートマッチングの画像の読み込みが出来ません

shutein

総合スコア14

OpenCV

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

Java

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

Android Studio

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

0グッド

0クリップ

投稿2017/11/03 06:54

編集2017/11/05 06:20

###前提・実現したいこと
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

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらはAndroidのアプリケーションという認識で大丈夫でしょうか?
でしたらアクセス権限のないところに画像ファイルを置いているのかと思います。

assets/
res/raw/
data/

などに置いて
String dirPath = Environment.getDataDirectory().getPath();
などで親のディレクトリのパスを取得して。
imread(dirPath + "[filename]");

のようにして読み込んでみてください。

http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=Android044_FileAccess

投稿2017/11/09 09:11

Yukihiro2119

総合スコア49

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

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

shutein

2017/11/09 14:50

はい。Androidのアプリケーションを開発しています。 画像ファイルはappとOpenCVLibraryのどちらのプロジェクトに画像を置けばいいのでしょうか。 OpenCVの方に入れて試してみたら同じようなエラーが出てしまいました。
shutein

2017/11/09 15:09

画像ファイルはresのdrawableに置くのでは動作しませんか やはり、resの下にrawを新しく作る必要があるのでしょうか
Yukihiro2119

2017/11/13 03:44

app側に配置してください。 package名がアプリケーションのルートパスになるので、実行時のルートパスに合わせる必要があります。 あぁ、すみません。画像であればdrawableですね。 当方、動画と勘違いしておりました。 drawableからの場合だと、DrawableをBitmapFactoryを介して一度Bitmapに変換。 Bitmap経由でMat(OpenCv)に変換する必要があるかもです。(org.opencv.android の #bitmapToMat) 直接imreadでmatに読み込めないかもです。 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.###); Mat mat = bitmapToMat(bitmap);
shutein

2017/11/14 06:25

下のようにやってみたのですが、 openCVのbitmapTomatを使用する際にエラーを修正したら Utils.javaで別のエラーが発生してしまいました。 Error:(103, 26) エラー: シンボルを見つけられません シンボル: 変数 mat 場所: クラス Utils 何か間違えてしまったのでしょうか
shutein

2017/11/14 06:26

コードはこんな感じです String dirPath = Environment.getDataDirectory().getPath(); Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.circle3); Mat mat =bitmapToMat(bitmap); // 下記部分に動いていない部分がある 画像を読み込めているかなど確認 //画像に関しては画像を表示するようなことを記述する  //対象画像とテンプレート画像を読み込み Mat img = m_temp; Mat tmpl = Imgcodecs.imread(dirPath + "circle3.png");
Yukihiro2119

2017/11/14 06:35 編集

namespaceの問題っぽいですね。Utilsが被っているのかもしれません。 Utils.javaはorg.opencv.android.UtilsのUtilsですかね? import部分を載せて頂けるとアドバイスできるかもしれません。 ちなみに、自作でUtils.java とか作られていたりします?
shutein

2017/11/14 06:37

はい。org.opencv.android.Utilsです。 色々参考にしていて長いのですがimport部分です。 import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.GradientDrawable; import android.hardware.Camera; import android.hardware.Camera.ShutterCallback; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Toast; import android.os.Build; import android.app.Activity; import org.opencv.android.JavaCameraView; import org.opencv.android.OpenCVLoader; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.core.Scalar; import org.opencv.core.Point; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.android.OpenCVLoader; import java.io.File; import java.io.FileOutputStream; import static android.R.attr.fragmentAllowReturnTransitionOverlap; import static android.R.attr.key; import static android.R.attr.y; import static android.view.MotionEvent.ACTION_DOWN; import static org.opencv.android.Utils.bitmapToMat; import static org.opencv.core.CvType.CV_8U; import static org.opencv.imgproc.Imgproc.COLOR_GRAY2RGB; import static org.opencv.imgproc.Imgproc.TM_CCOEFF_NORMED; import static org.opencv.imgproc.Imgproc.matchTemplate;
Yukihiro2119

2017/11/14 06:57

そうですね、とりあえず。 ① Mat mat = Utils.bitmapToMat(bitmap); に変更してみる。 ② 恐らく赤い下線部が入ってるであろうmatの部分にカーソルを合わせて(Enter+Alt)を押してみる。 (importなどの修正方法が提示されるかも) など、ちょっといろいろ試してみてください。
shutein

2017/11/14 07:18

一つ前のコメントですが、Utils.javaの自作はしてないです。 ただ、エラー修正でchange signature bitmapToMat()と表示されて 試してから実行したらエラーが起こりました。 エラーを消すために試したので、もしかしたらミスがあるかもしれません。 public static Mat bitmapToMat(Bitmap bmp ,Mat mat) { bitmapToMat(bmp, mat , false); return null; }
shutein

2017/11/14 08:22

色々試してみたら、このように記述したら先ほどのエラーは無くなりました Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.circle3); Mat tmpl =new Mat(); Mat mat = Utils.bitmapToMat(bitmap,tmpl); ですが今度は実行時にエラーが発生してしまったので調べてみようと重いんす。
shutein

2017/11/14 08:26

間違えました、「調べてみようと思います」です。
Yukihiro2119

2017/11/14 09:02 編集

おっと失礼、Utils.bitmapToMat()の引数間違えてましたね。 Mat mat = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC3); Utils.bitmapToMat(bitmap,mat); //以降matに対して処理〜 でいかがでしょう?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問