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

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

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

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

Java

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

Android Studio

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

Q&A

0回答

2138閲覧

テンプレートマッチングで複数検出が上手くできません

tomoe

総合スコア12

OpenCV

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

Java

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

Android Studio

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

0グッド

0クリップ

投稿2016/12/26 02:17

編集2022/01/12 10:55

###前提・実現したいこと
画像の複数検知を行いたく、以前作ったテンプレートマッチングのコードを編集しましたが、うまく検知できません。
検知した部分を赤線で囲うようにしてあるのですが全部真っ赤に染まってしまいます。解決法わかる方がいましたらお助けくださいm(__)m

gyazoになりますが以下のようになります。
https://gyazo.com/f5fb8f7dea5a1ab049f5543d929588b9

下記のサイトを参考にしました。
http://www.moonmile.net/blog/archives/2468

http://workpiles.com/2015/05/opencv-matchtemplate-java/

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

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

TemplateMatching.java

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); Log.d("match","new_end"); Log.d("match","run_end"); } }

MatchingDemo.java

public class MatchingDemo { private Mat img; private Mat templ[]; private Mat result[]; public Bitmap dst2; private SurfaceHolder m_surfaceHolder; public MatchingDemo() { } 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[13]; result = new Mat[13]; for (int tm = 0; tm < 3; tm++) { templ[tm] = new Mat(templateFile[tm].getHeight(), templateFile[tm].getWidth(), CvType.CV_8UC1); Utils.bitmapToMat(inFile, img); Utils.bitmapToMat(templateFile[tm], templ[tm]); //結果を作成 int result_cols = img.cols() - templ[tm].cols() + 1; int result_rows = img.rows() - templ[tm].rows() + 1; result[tm] = new Mat(result_rows, result_cols, CvType.CV_32FC1); // match_method = 0; // 正規化とマッチングを行う Imgproc.matchTemplate(img, templ[tm], result[tm], match_method); Core.normalize(result[tm], result[tm], 0, 1, Core.NORM_MINMAX, -1, new Mat()); //結果から相関係数がしきい値以下を削除(0にする) for (int i = 0; i < result[tm].rows(); i++) { for (int j = 0; j < result[tm].cols(); j++) { if (result[tm].get(i, j)[0] > 0) { Core.rectangle(img, new Point(j, i), new Point(j + templ[tm].cols(), i + templ[tm].rows()), new Scalar(255, 0, 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 (API22)

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問