1

OpenCV を使用して Android カメラにアクセスしようとしています。プロジェクトの作成に成功し、問題なく実行されました。インターネットからのコードを使用して、プロジェクトでチェックしようとしました。しかし、アプリが停止しました。RuntimeException の問題のようですが、解決方法がわかりません。これは私のコードで、この Web サイトhttp://people.oregonstate.edu/~robinsti/CS_496/Tutorial/からコピーしたものです。

mainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnTouchListener, CameraBridgeViewBase.CvCameraViewListener2{

private CameraBridgeViewBase mOpenCvCameraView;
private Mat mRgba;

@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
    setContentView(R.layout.activity_main);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.Surface);
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
    //mOpenCvCameraView.setMaxFrameSize(176, 152);
    mOpenCvCameraView.setCvCameraViewListener(this);
}

private BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        super.onManagerConnected(status);
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                mOpenCvCameraView.enableView();
                mOpenCvCameraView.setOnTouchListener(MainActivity.this);
            } break;
            default: {
                super.onManagerConnected(status);
            } break;
        }
    }
};

@Override
public void onPause() {
    super.onPause();
    if(mOpenCvCameraView != null) {
        mOpenCvCameraView.disableView();
    }
}

@Override
public void onResume() {
    super.onResume();
    if(mOpenCvCameraView != null) {
        mOpenCvCameraView.disableView();
    }

}


@Override
public void onDestroy() {
    super.onDestroy();

    if(!OpenCVLoader.initDebug()) {
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0,this, mLoaderCallBack);
    }
    else {
        mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

@Override
public void onCameraViewStarted(int width, int height) {

}

@Override
public void onCameraViewStopped() {

}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    mRgba = inputFrame.rgba();
    return mRgba;
}

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    return false;
}

}

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="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
tools:context="com.tech.te.smartrotate.MainActivity">

<org.opencv.android.JavaCameraView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/Surface" />

</RelativeLayout>

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="                 ">
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-feature android:name="android.hardware.camera.front"/>
<uses-feature android:name="android.hardware.camera.front.autofocus"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen">        <!--android:theme="@style/AppTheme">-->
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

ログキャット:

07-29 15:54:44.066 31188-31188/com.tech.te.app W/art: DexFile /data/data/com.tech.te.app/files/instant-run/dex/ の OatDexFile が見つかりませんでしたOatFile /data/data/com のチェックサム 0x7f90e189 を含む slice-slice_2-classes.dex (正規パス /data/data/com.tech.te.app/files/instant-run/dex/slice-slice_2-classes.dex) .tech.te.app/cache/slice-slice_2-classes.dex
07-29 15:54:45.836 31188-31195/com.tech.te.app W/art: すべてのスレッドの中断にかかった時間: 19.602ms
07-29 15:54:45.946 31188-31188/com.tech.te.app D/DisplayManager: DisplayManager()
07-29 15:54:46.376 31188-31188/com.tech.te.app W/art: Android 4.1 より前、メソッド android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter 、android.content.res.ColorStateList、android.graphics.PorterDuff$Mode) は、android.graphics.drawable.Drawable の package-private メソッドを誤ってオーバーライドしていました。
07-29 15:54:46.596 31188-31188/com.tech.te.app E/VdcInflateDelegate: 膨張中の例外
                                                                             java.lang.RuntimeException: インデックス 1 で属性を解決できませんでした
                                                                                 android.content.res.TypedArray.twGetColorStateList(TypedArray.java:437) で
                                                                                 android.content.res.TypedArray.getColorStateList(TypedArray.java:419) で
                                                                                 android.support.graphics.drawable.VectorDrawableCompat.updateStateFromTypedArray (VectorDrawableCompat.java:518) で
                                                                                 android.support.graphics.drawable.VectorDrawableCompat.inflate (VectorDrawableCompat.java:472) で
                                                                                 android.support.graphics.drawable.VectorDrawableCompat.createFromXmlInner (VectorDrawableCompat.java:436) で
                                                                                 android.support.v7.widget.AppCompatDrawableManager$VdcInflateDelegate.createFromXmlInner(AppCompatDrawableManager.java:708) で
                                                                                 android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates (AppCompatDrawableManager.java:348) で
                                                                                 android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:188) で
                                                                                 android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:181) で
                                                                                 android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup (AppCompatDrawableManager.java:689) で
                                                                                 android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:186) で
                                                                                 android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:77) で
                                                                                 android.support.v7.app.AppCompatDelegateImplBase.(AppCompatDelegateImplBase.java:83) で
                                                                                 android.support.v7.app.AppCompatDelegateImplV7.(AppCompatDelegateImplV7.java:146) で
                                                                                 android.support.v7.app.AppCompatDelegateImplV11 で。(AppCompatDelegateImplV11.java:28)
                                                                                 android.support.v7.app.AppCompatDelegateImplV14 で。(AppCompatDelegateImplV14.java:41)
                                                                                 android.support.v7.app.AppCompatDelegate.create (AppCompatDelegate.java:193) で
                                                                                 android.support.v7.app.AppCompatDelegate.create (AppCompatDelegate.java:173) で
                                                                                 android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:511) で
                                                                                 android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:71) で
                                                                                 android.app.Activity.performCreate(Activity.java:6112) で
                                                                                 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1117) で
                                                                                 Android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2609) で
                                                                                 Android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2721) で
                                                                                 android.app.ActivityThread.access$900 で (ActivityThread.java:168)
                                                                                 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) で
                                                                                 android.os.Handler.dispatchMessage(Handler.java:102) で
                                                                                 android.os.Looper.loop(Looper.java:135)
                                                                                 Android.app.ActivityThread.main (ActivityThread.java:5753) で
                                                                                 java.lang.reflect.Method.invoke(ネイティブ メソッド) で
                                                                                 java.lang.reflect.Method.invoke(Method.java:372) で
                                                                                 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) で
                                                                                 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200) で
07-29 15:54:46.596 31188-31202/com.tech.te.app I/art: バックグラウンド スティッキー コンカレント マーク スイープ GC 解放 6652(1091KB) AllocSpace オブジェクト、1(20KB) LOS オブジェクト、14% フリー、5MB/ 6MB、一時停止 36.125ms 合計 277.107ms
07-29 15:54:46.616 31188-31202/com.tech.te.app I/art: バックグラウンド スティッキー コンカレント マーク スイープ GC 解放 274(43KB) AllocSpace オブジェクト、0(0B) LOS オブジェクト、14% フリー、5MB/ 6MB、一時停止 7.366ms 合計 16.707ms
07-29 15:54:46.706 31188-31188/com.tech.te.app D/AndroidRuntime: VM のシャットダウン
07-29 15:54:46.716 31188-31188/com.tech.te.app E/AndroidRuntime: 致命的な例外: メイン
                                                                         プロセス: com.tech.te.app、PID: 31188
                                                                         java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tech.te.app/com.tech.te.app.MainActivity}: java.lang.IllegalStateException: Theme.AppCompat テーマ (または子孫) を使用する必要がありますこの活動で。
                                                                             Android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2656) で
                                                                             Android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2721) で
                                                                             android.app.ActivityThread.access$900 で (ActivityThread.java:168)
                                                                             android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) で
                                                                             android.os.Handler.dispatchMessage(Handler.java:102) で
                                                                             android.os.Looper.loop(Looper.java:135)
                                                                             Android.app.ActivityThread.main (ActivityThread.java:5753) で
                                                                             java.lang.reflect.Method.invoke(ネイティブ メソッド) で
                                                                             java.lang.reflect.Method.invoke(Method.java:372) で
                                                                             com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) で
                                                                             com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200) で
                                                                          原因: java.lang.IllegalStateException: このアクティビティで Theme.AppCompat テーマ (または子孫) を使用する必要があります。
                                                                             android.support.v7.app.AppCompatDelegateImplV7.createSubDecor (AppCompatDelegateImplV7.java:343) で
                                                                             android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor (AppCompatDelegateImplV7.java:312) で
                                                                             android.support.v7.app.AppCompatDelegateImplV7.onPostCreate (AppCompatDelegateImplV7.java:167) で
                                                                             android.support.v7.app.AppCompatActivity.onPostCreate (AppCompatActivity.java:98) で
                                                                             android.app.Instrumentation.callActivityOnPostCreate (Instrumentation.java:1198) で
                                                                             Android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2638) で
                                                                             Android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2721) で 
                                                                             android.app.ActivityThread.access$900 で (ActivityThread.java:168) 
                                                                             android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) で 
                                                                             android.os.Handler.dispatchMessage(Handler.java:102) で 
                                                                             android.os.Looper.loop(Looper.java:135) 
                                                                             Android.app.ActivityThread.main (ActivityThread.java:5753) で 
                                                                             java.lang.reflect.Method.invoke(ネイティブ メソッド) で 
                                                                             java.lang.reflect.Method.invoke(Method.java:372) で 
                                                                             com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) で 
                                                                             com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200) で 
07-29 15:54:50.366 31188-31188/com.tech.te.app I/プロセス: 信号を送信しています。PID: 31188 SIG: 9

どうもありがとう。

4

1 に答える 1

0

OnDestroy に OpenCV をロードしていますが、これを行うべきではありません。

@Override
public void onDestroy() {
    super.onDestroy();

    if(!OpenCVLoader.initDebug()) {
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0,this, mLoaderCallBack);
    }
    else {
        mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

また、initDebug と initAsync を同時に使用しないでください。

initDebug は静的初期化用です。apk 内にライブラリが必要です。

initAsync は、OpenCV Manager がインストールされた状態で使用します。

静的初期化の場合、良い答えがありますここ

onResume、onPause、および onDestroy は次のようになります。

@Override
protected void onResume()
{
    super.onResume();
    _javaCameraView.enableView();
}

@Override
protected void onPause() {
    if (_javaCameraView != null) {
        _javaCameraView.disableView();
    }
    super.onPause();
}

@Override
public void onDestroy() {
    if (_javaCameraView != null) {
        _javaCameraView.disableView();
    }
    super.onDestroy();
}

静的初期化に関する情報:

public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener2 {

private static boolean openCVStarted = false;
JavaCameraView _javaCameraView;

    static{
        System.loadLibrary("opencv_java3");


        if(!OpenCVLoader.initDebug()) {
            Log.d("ERROR", "Unable to load OpenCV");
            openCVStarted = false;
        } else {
            Log.d("SUCCESS", "OpenCV loaded");
            openCVStarted = true;
        }
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _javaCameraView = (JavaCameraView)findViewById(R.id.cameraView);
        //_javaCameraView.setMaxFrameSize(size.width, size.height);
        _javaCameraView.setVisibility(SurfaceView.VISIBLE);
        _javaCameraView.setCvCameraViewListener(this);
        _javaCameraView.enableView();
        _javaCameraView.enableFpsMeter();
    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)
    {
        _imgBgrTemp = inputFrame.rgba();
        // Work with the frame here
        return _imgBgrTemp;
    }
于 2016-07-29T13:30:22.250 に答える