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