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

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

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

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

Java

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

Android Studio

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

受付中

複数検出が上手くいかない

tomoe
tomoe

総合スコア0

OpenCV

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

Java

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

Android Studio

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

0回答

-1評価

0クリップ

1734閲覧

投稿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

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase\.CvCameraViewListener2 { private static String TAG = "MainActivity"; JavaCameraView javacameraview; Mat mOutputFrame;//出力画像 Mat mOutputFrame2;//画像保持用 Bitmap temp; Bitmap\[\] temp_img; int touId = 0;//フラグ変数 public Mat result; Bitmap dst; Bitmap dst999; ImageView mImageView; 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\.sample2\); // mImageView = \(ImageView\)findViewById\(R\.id\.image\); temp_img = new Bitmap\[34\]; // for\(int i = 0; i < 34; i\+\+\){ // temp_img\[i\] = new Bitmap\(\); // } // temp_img\[0\] = temp; temp_img\[0\] = BitmapFactory\.decodeResource\(getResources\(\), R\.drawable\.ton\); temp_img\[1\] = BitmapFactory\.decodeResource\(getResources\(\), R\.drawable\.so_zu1\); temp_img\[2\] = BitmapFactory\.decodeResource\(getResources\(\), R\.drawable\.sample2\); } @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\); //\(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\); TemplateMatching\.main\(dst, temp_img, "c:/Users/Public/Pictures/dst\.png", this\); //MatchingDemoからの結果を画面に表示 runOnUiThread\(new Runnable\(\) { @Override public void run\(\) { ImageView imageView = \(ImageView\) findViewById\(R\.id\.image\); imageView\.setImageBitmap\(dst\); } }\); touId = 2; break; case 2: dst = null; 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

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)

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenCV

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

Java

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

Android Studio

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