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

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

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

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

Android Studio

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

Q&A

解決済

2回答

5610閲覧

AndroidでMatに代入すると実行エラーが起こる

ANUBIS

総合スコア7

OpenCV

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

Android Studio

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

0グッド

0クリップ

投稿2016/08/02 05:50

編集2016/08/02 09:36

OSはLinux Debianを使用しており、Android Studio2.1.2にOpenCV3.1.0 を導入してプログラムを作成しています。
タイトル通り、Mat形式の変数にnew Mat()などのデータを代入すると実行エラーが発生し、プログラムが強制終了されてしまいます。
ただ、inputFrameを代入する場合は実行エラーは発生しません。

導入については
Fairu>New>Improt ModuleでOpenCVのJavaフォルダ選択して読み込み、OpenCVのbuild.gradleのcompileSdkVersionを24に変更しました。

様々なサイトを調べたのですが、1週間立っても答えにたどり着けませんでした。

デフォルトのプロジェクトにMatを代入するというとても簡単なプログラムでも発生します。

public class MainActivity extends AppCompatActivity {
private Mat tmpl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tmpl=new Mat();
}

このプログラムでのエラーは以下のとおりです

###発生している問題・エラーメッセージ
08-02 14:22:20.229 21215-21215/com.example.bisfate.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.bisfate.myapplication, PID: 21215
java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.core.Mat.n_Mat:()J
at org.opencv.core.Mat.n_Mat(Native Method)
at org.opencv.core.Mat.<init>(Mat.java:24)
at com.example.bisfate.myapplication.MainActivity.onCreate(MainActivity.java:17)
at android.app.Activity.performCreate(Activity.java:5275)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
at dalvik.system.NativeStart.main(Native Method)

どこのサイトでも同じようにやっている代入方法でプログラムが落ちるので、非常に困っています。
原因がわかる方がいましたら、ご返答おねがいします。

追記
以下元々作っていたプログラムです。
設定がどれに当たるかわからなかったので、手を加えたxmlの追加分のみとjava全文を記述しました。

OpenCVのデフォルトプログラムをベースにタップした際にカメラから得た画像を処理した画像を表示するプログラム

javaのonCreate内のコメントアウトしてある行を戻すと実行エラーが起きます。

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 android:orientation="vertical" 7 tools:context="com.example.bisfate.decood.MainActivity"> 8 9 <org.opencv.android.JavaCameraView 10 android:id="@+id/camera_view" 11 android:layout_width="fill_parent" 12 android:layout_height="fill_parent" 13 android:visibility="visible" /> 14 15</RelativeLayout> 16

AndroidManifest.xml

xml

1 <uses-permission android:name="android.permission.CAMERA" /> 2 <uses-feature android:name="android.hardware.camera"/> 3 <uses-feature android:name="android.hardware.camera.autofocus"/> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

java

1MainActivity.java 2package com.example.bisfate.decood; 3import android.app.Activity; 4import android.graphics.Bitmap; 5import android.graphics.BitmapFactory; 6import android.os.Bundle; 7import android.util.Log; 8import android.view.MotionEvent; 9import org.opencv.android.BaseLoaderCallback; 10import org.opencv.android.CameraBridgeViewBase; 11import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; 12import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; 13import org.opencv.android.LoaderCallbackInterface; 14import org.opencv.android.OpenCVLoader; 15import org.opencv.core.CvType; 16import org.opencv.core.Mat; 17import org.opencv.imgproc.Imgproc; 18public class MainActivity extends Activity implements CvCameraViewListener2 { 19 private CameraBridgeViewBase mCameraView; 20 private Mat mOutputFrame;//出力画像 21 private Mat mOutputFrame2;//画像保持用 22 private Mat mat; 23 private Mat tmpl;//テンプレート画像用Mat 24 private int touId=0;//フラグ変数 25 private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 26 private String TAG = "decood"; 27 @Override 28 public void onManagerConnected(int status) { 29 switch (status) { 30 case LoaderCallbackInterface.SUCCESS: 31 Log.i(TAG, "OpenCV loaded successfully"); 32 mCameraView.enableView(); 33 break; 34 default: 35 super.onManagerConnected(status); 36 break; 37 } 38 } 39 }; 40 @Override 41 protected void onCreate(Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 Bitmap scr= BitmapFactory.decodeResource(getResources(),R.drawable.qrmark);//テンプレートJPG画像読み込み 44// mat=new Mat(); 45// mat=new Mat(new Size(85, 85), CvType.CV_8UC4); 46// tmpl= Utils.bitmapToMat(scr,mat); 47 setContentView(R.layout.activity_main); 48 mCameraView = (CameraBridgeViewBase)findViewById(R.id.camera_view); 49 mCameraView.setCvCameraViewListener(this); 50 } 51 52 @Override 53 public void onPause() { 54 if (mCameraView != null) { 55 mCameraView.disableView(); 56 } 57 super.onPause(); 58 } 59 60 @Override 61 protected void onResume() { 62 super.onResume(); 63 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); 64 } 65 66 @Override 67 public void onDestroy() { 68 super.onDestroy(); 69 if (mCameraView != null) { 70 mCameraView.disableView(); 71 } 72 } 73 74 @Override 75 public void onCameraViewStarted(int width, int height) { 76 mOutputFrame = new Mat(height, width, CvType.CV_8UC1); 77 } 78 79 @Override 80 public void onCameraViewStopped() { 81 mOutputFrame.release(); 82 } 83 84 @Override 85 public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 86 switch (touId){ 87 case 0: 88 mOutputFrame=inputFrame.rgba(); 89 break; 90 case 1: 91 Imgproc.threshold(inputFrame.gray(), mOutputFrame, 127.0, 255.0, Imgproc.THRESH_BINARY);//二値化 92 mOutputFrame2=mOutputFrame; 93 touId=2; 94 break; 95 case 2: 96 mOutputFrame=mOutputFrame2; 97 break; 98 } 99 return mOutputFrame; 100 } 101 102 @Override 103 public boolean onTouchEvent(MotionEvent ev) { 104 switch (ev.getAction()) { 105 case MotionEvent.ACTION_DOWN: 106 //画面がタッチされたときの動作 107 if(touId==0){ 108 touId=1; 109 } 110 else if(touId==2){ 111 touId=0; 112 } 113 break; 114 case MotionEvent.ACTION_CANCEL: 115 //他の要因によってタッチがキャンセルされたときの動作 116 break; 117 } 118 return super.onTouchEvent(ev); 119 } 120}

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

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

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

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

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

guest

回答2

0

ベストアンサー

正しくライブラリを読み込めていないようですね。ライブラリのロードはしましたか?

また、導入したとはどういった導入方法でしょうか?なにをしたのかを追記してください。

投稿2016/08/02 06:09

編集2016/08/02 06:09
yona

総合スコア18155

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

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

ANUBIS

2016/08/02 06:27

お答えありがとうございます。 ライブラリのロードとは、最初に行うImprot Moduleとは違うのでしょうか? 導入について、更新しました。
yona

2016/08/02 06:47

それはプロジェクトの設定ですね。 プログラム上でのロードもしろと公式サイトに載っていますよ。
ANUBIS

2016/08/02 07:15

お答えありがとうございます。 自分、英文読解力が低く、自力で公式サイトがすぐには読めません…… 現在公式サイトをGoogle翻訳で訳したもの(読みにくいですが)と原文を並べて見ているのですが、どのあたりにそのような記述があるのでしょうか
yona

2016/08/02 07:29

英語が読めなくてもコードは読めますよね? OpenCVLoader.initAsyncかOpenCVLoader.initDebugのコード周辺の処理を書きましょう。 どちらを書くかは導入方法によりますが。
ANUBIS

2016/08/02 08:06

はい、コードは読めます。 ですが、両者の違いがわかりません。 また、後者に至っては記述する位置もわかりません。 質問に上げたのとは別の元々作成していたプログラムを確認したのですが、前者のOpenCVLoader.initAsyncが既に記述された状態でした。 また、挙動も実行エラーの記述も近似しています。
yona

2016/08/02 08:12 編集

もともとの動くプログラムにはOpenCVLoader.initAsyncの記述があるが、今の動かないプログラムにはOpenCVLoader.initAsyncの記述がないということでしょうか? それならその差を埋めれば動くと思います。 それとも両方動かないのでしょうか?
ANUBIS

2016/08/02 08:12

両方動きません
yona

2016/08/02 08:19

もともとのプログラムはどこから来たものですか?公式のサンプルですか? それもとブログのコピペですか?
ANUBIS

2016/08/02 08:22

OpenCVのサンプル、tutorial-1-camerapreviewです それをベースに改造したもので、それにパターンマッチングの機能を組み込もうとしてこの問題に引っかかっている感じです。
yona

2016/08/02 08:25

サンプルはもともと動かなかったのか、最初は動いていたけど、改造していくうちに動かなくなったはどちらですか?
ANUBIS

2016/08/02 08:28

最初は動いていました。 パターンマッチングの機能を組み込もうとした段階でこのエラーが出るようになりました。 パターンマッチングの文を消すと元通り実行できるようになります。
yona

2016/08/02 08:44

それは質問に書きましょうね。なぞなぞじゃないので必要な情報はしっかり書きましょう。時間の無駄です。 現状のプログラムは動いていたものを壊すコードが含まれています。 追加したコード、設定を質問に追記してください。コードが長いならなにをしたかを詳細に書いてください。
ANUBIS

2016/08/02 09:22

わかりました。質問の方を更新しました。
yona

2016/08/02 09:32

コードはコード用の記述にしてください
yona

2016/08/02 09:35

onCreateはonResumeよりも前に呼ばれます。そのためOpenCVのライブラリロードが終了していない状態でMatにアクセスしようとしているため質問のエラーが出ます。 なので、追加したコードの位置をonResumeの後、さらに言うとライブラリロードが終了したあとに変更しましょう。
ANUBIS

2016/08/02 09:42

ありがとうございます。 そこが原因だったんですね。 ようやく動かすことができました。
yona

2016/08/02 09:52

お疲れ様です。 ライフサイクルには注意しましょう。
guest

0

java.lang.UnsatisfiedLinkErrorとなっていますが、OpenCVはただプロジェクトに読み込んだだけでは動かず、ロードする必要があります(公式ドキュメント)。

投稿2016/08/02 06:02

編集2016/08/02 06:09
maisumakun

総合スコア145183

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

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

ANUBIS

2016/08/02 06:15

お答えありがとうございます。 org.opencv.android.JavaCameraViewを使ったプログラムではMatが機能していたので組み込めていると思っていたのですが、違うのでしょうか? Fairu>New>Improt ModuleでOpenCVを読み込み、OpenCVのbuild.gradleのcompileSdkVersionを24に書き換えたのですが違うのならその方法を教えてもらえないでしょうか。
maisumakun

2016/08/02 06:50

上のリンクにもあるように、ロードするコードも必要です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問