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

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

ただいまの
回答率

90.51%

  • Android Studio

    4288questions

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

  • OpenCV

    1506questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,580

ANUBIS

score 1

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

<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" />
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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/02 15:27

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

    導入について、更新しました。

    キャンセル

  • 2016/08/02 15:47

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

    キャンセル

  • 2016/08/02 16:15

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

    キャンセル

  • 2016/08/02 16:29

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

    キャンセル

  • 2016/08/02 17:06

    はい、コードは読めます。
    ですが、両者の違いがわかりません。
    また、後者に至っては記述する位置もわかりません。

    質問に上げたのとは別の元々作成していたプログラムを確認したのですが、前者のOpenCVLoader.initAsyncが既に記述された状態でした。
    また、挙動も実行エラーの記述も近似しています。

    キャンセル

  • 2016/08/02 17:11 編集

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

    それとも両方動かないのでしょうか?

    キャンセル

  • 2016/08/02 17:12

    両方動きません

    キャンセル

  • 2016/08/02 17:19

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

    キャンセル

  • 2016/08/02 17:22

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

    キャンセル

  • 2016/08/02 17:25

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

    キャンセル

  • 2016/08/02 17:28

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

    キャンセル

  • 2016/08/02 17:44

    それは質問に書きましょうね。なぞなぞじゃないので必要な情報はしっかり書きましょう。時間の無駄です。

    現状のプログラムは動いていたものを壊すコードが含まれています。
    追加したコード、設定を質問に追記してください。コードが長いならなにをしたかを詳細に書いてください。

    キャンセル

  • 2016/08/02 18:22

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

    キャンセル

  • 2016/08/02 18:32

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

    キャンセル

  • 2016/08/02 18:35

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

    キャンセル

  • 2016/08/02 18:42

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

    キャンセル

  • 2016/08/02 18:52

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

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/02 15:15

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

    キャンセル

  • 2016/08/02 15:50

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

    キャンセル

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

  • Android Studio

    4288questions

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

  • OpenCV

    1506questions

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