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

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

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

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

Java

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

Android Studio

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

Q&A

解決済

1回答

2347閲覧

結果画像を出力させたい

tomoe

総合スコア12

OpenCV

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

Java

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

Android Studio

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

0グッド

0クリップ

投稿2016/12/19 01:46

編集2016/12/19 03:54

マッチングした結果を表示させたいのですがMainActivity.javaの"//アプリが落ちる"というところで強制終了されてしまいます。
解決法わかる方がいましたら教えてくださいm(__)m

流れとしてはMainActivity→TemplateMaching→MachingDemo→MainActivityとなっています。

下記URLは落ちる直前までデバックモードで進めた画像です。
https://gyazo.com/45fa2be10ae66a68e3cb58dccc5d3692

エラー文
1万文字越えてしまうのでgyazoになります
https://gyazo.com/d66388934271d0398ec9761960660b3e

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

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

TemplateMatching.java

TemplateMatching.java

1//変更点2 (MainActivity actを追加)2016/12/14 2 3public class TemplateMatching { 4 public static void main(Bitmap dst, Bitmap temp, String outFile, MainActivity act) { 5 Log.d("tem_match","Library_start"); 6 try{ 7 System.loadLibrary("opencv_java"); 8 Log.d("tem_match","Library_end"); 9 }catch(Exception e){ 10 Log.d("tem_match","Library_error"); 11 } 12 new MatchingDemo().run(dst, temp, outFile, Imgproc.TM_CCOEFF, act); 13 14}

MachingDemo.java

MachingDemo.java

1public class MatchingDemo { 2 private Mat img; 3 private Mat templ; 4 private Mat result; 5 public Bitmap dst2; 6 7 8 public MatchingDemo() { 9 } 10 11 //変更点3 (MainActivity actを追加)2016/12/14 12 public void run(Bitmap inFile, Bitmap templateFile, String outFile, int match_method, MainActivity act) { 13 System.out.println("\nRunning Template Matching"); 14 15 img = new Mat(inFile.getHeight(), inFile.getWidth(), CvType.CV_8UC1); 16 templ = new Mat(templateFile.getHeight(), templateFile.getWidth(), CvType.CV_8UC1); 17 Utils.bitmapToMat(inFile, img); 18 Utils.bitmapToMat(templateFile, templ); 19 20 //結果を作成 21 int result_cols = img.cols() - templ.cols() + 1; 22 int result_rows = img.rows() - templ.rows() + 1; 23 result = new Mat(result_rows, result_cols, CvType.CV_32FC1); 24 25 26 // 正規化とマッチングを行う 27 Imgproc.matchTemplate(img, templ, result, match_method); 28 Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat()); 29 30 //閾値が最も高いものを選ぶ 31 Core.MinMaxLocResult mmr = Core.minMaxLoc(result); 32 //マッチング時の最大値と最小値を返す 33 Point matchLoc; 34 if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { 35 matchLoc = mmr.minLoc; 36 } else { 37 matchLoc = mmr.maxLoc; 38 } 39 40 //マッチしたところを囲む 41 Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(), 42 matchLoc.y + templ.rows()), new Scalar(0, 255, 0)); 43 44 //(Mat型をbitmap型に変換 45 dst2 = Bitmap.createBitmap(img.width(), img.height(), Bitmap.Config.ARGB_8888); 46 Utils.matToBitmap(img, dst2); 47 act.dst = dst2; 48 49 50 } 51} 52

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

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

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

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

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

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

yag

2016/12/19 02:13

アプリが落ちた際のエラーログ及び、アプリが落ちているLineの横にコメントアウトで『アプリが落ちる』と記載した方がいいかと思います。
tomoe

2016/12/19 03:12

レーンの上ではなく横のほうが良いんですね 修正しますm(__)m
yag

2016/12/19 03:32

ありがとうございます。落ちた際のエラーログが出力されているかと思いますが、記載の追加お願い出来ますか?
yag

2016/12/19 03:34

すいません、エラーログは出力されていないとなっていましたね。
tomoe

2016/12/19 03:37

こちらに記載するべきでした こちらこそ申し訳ありませんm(__)m
yag

2016/12/19 03:47

落ちているのにエラーが出力されていないというのが経験上は無いのですが、どこかに出力されていないか再度ご確認お願いできますか?ご存知かもしれませんが、エラーはDebuggerの方ではなくConsoleの方に出力されているはずです。
tomoe

2016/12/19 03:55 編集

追加しました。1万文字越えるためgyazoになります
guest

回答1

0

ベストアンサー

onCameraFrameがメインスレッド以外で動作しているのが問題のようですね。

エラーに記載されている下記部分
Only the original thread that created a view hierarchy can touch its views.

Androidはメインスレッド以外からのUIの操作が許可されていません。
対策としては下記の様になります。

new Handler().post(new Runnable() { @Override public void run() { ImageView imageView = (ImageView) findViewById(R.id.image); imageView.setImageBitmap(dst);//アプリが落ちる } }); 又は runOnUiThread(new Runnable() { @Override public void run() { ImageView imageView = (ImageView) findViewById(R.id.image); imageView.setImageBitmap(dst);//アプリが落ちる } });

投稿2016/12/19 04:03

編集2016/12/19 04:06
yag

総合スコア100

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

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

tomoe

2016/12/19 04:13

runOnUiThread(new Runnable() { @Override public void run() { ImageView imageView = (ImageView) findViewById(R.id.image); imageView.setImageBitmap(dst);//アプリが落ちる } }); でうまく表示されました!ありがとうございましたm(__)m
yag

2016/12/19 04:21

良かったです。 余計なおせっかいですが、 長くて読むのが嫌になるエラーでもしっかり読むことが最速の解決方法になります。 慣れるまで大変だとは思いますが 不具合が発生⇒まずはログを見る。を心がけて今後も頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問