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

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

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

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

Android Studio

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

解決済

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

ANUBIS
ANUBIS

総合スコア7

OpenCV

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

Android Studio

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

2回答

0評価

0クリップ

4830閲覧

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

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:context="com.example.bisfate.decood.MainActivity"> <org.opencv.android.JavaCameraView android:id="@+id/camera_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:visibility="visible" /> </RelativeLayout>

AndroidManifest.xml

xml

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

java

MainActivity.java package com.example.bisfate.decood; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; public class MainActivity extends Activity implements CvCameraViewListener2 { private CameraBridgeViewBase mCameraView; private Mat mOutputFrame;//出力画像 private Mat mOutputFrame2;//画像保持用 private Mat mat; private Mat tmpl;//テンプレート画像用Mat private int touId=0;//フラグ変数 private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { private String TAG = "decood"; @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: Log.i(TAG, "OpenCV loaded successfully"); mCameraView.enableView(); break; default: super.onManagerConnected(status); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bitmap scr= BitmapFactory.decodeResource(getResources(),R.drawable.qrmark);//テンプレートJPG画像読み込み // mat=new Mat(); // mat=new Mat(new Size(85, 85), CvType.CV_8UC4); // tmpl= Utils.bitmapToMat(scr,mat); setContentView(R.layout.activity_main); mCameraView = (CameraBridgeViewBase)findViewById(R.id.camera_view); mCameraView.setCvCameraViewListener(this); } @Override public void onPause() { if (mCameraView != null) { mCameraView.disableView(); } super.onPause(); } @Override protected void onResume() { super.onResume(); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); } @Override public void onDestroy() { super.onDestroy(); if (mCameraView != null) { mCameraView.disableView(); } } @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(CvCameraViewFrame inputFrame) { switch (touId){ case 0: mOutputFrame=inputFrame.rgba(); break; case 1: Imgproc.threshold(inputFrame.gray(), mOutputFrame, 127.0, 255.0, Imgproc.THRESH_BINARY);//二値化 mOutputFrame2=mOutputFrame; touId=2; break; case 2: 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); } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenCV

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

Android Studio

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