簡體   English   中英

Android Things攝像頭流(帶有opencv)

[英]Android Things camera streaming (with opencv)

當我嘗試運行簡單的OpenCV應用程序時,對Android事物具有攝像頭許可問題,該消息顯示為“似乎您的設備不支持攝像頭(或它已鎖定),該應用程序將關閉。 消息的img Logcat-Android Studio中的過濾器,向我顯示OpenCV庫已正確加載,因此我認為問題可能是權限(您可以檢查我的AndroidManifest文件)或與OpenCV庫的兼容性不好...

Logcat也會報告此錯誤:“ E / JavaCameraView:相機#0無法打開:無法連接到相機服務”

鏈接到源代碼: https : //github.com/mrAlex-dev/CameraPreview-AndroidThings

PS我正在使用:Raspberry Pi 3 B,Raspberry Pi Camera v1.3,Android Things-0.4.1-devpreview,OpenCV-3.3.0-android-sdk ...

有人可以幫我嗎,我是新來的。

MainActivity.java的代碼:

package com.example.alexd.camerapreviewandroidthings;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener2 {

    private static String TAG = "MainActivity";
    JavaCameraView javaCameraView;
    Mat mRgba;

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

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

        javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view);
        javaCameraView.setVisibility(SurfaceView.VISIBLE);
        javaCameraView.setCvCameraViewListener(this);
    }

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

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

    @Override
    protected  void onResume(){
        super.onResume();
        if(OpenCVLoader.initDebug()){
            Log.i(TAG, "OpenCV loaded successfully");
            mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
        else{
            Log.i(TAG, "OpenCV not loaded");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_3_0, this, mLoaderCallBack);
        }
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        mRgba = new Mat(height, width, CvType.CV_8UC4);
    }

    @Override
    public void onCameraViewStopped() {
        mRgba.release();
    }

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

這是AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.alexd.camerapreviewandroidthings">

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

    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS" />

    <application>
        <uses-library android:name="com.google.android.things" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

這是Logcat錯誤:

09-13 08:50:29.812 1880-1880/? E/cutils-trace: Error opening trace file: No such file or directory (2)
09-13 08:50:30.026 1880-1880/? E/memtrack: Couldn't load memtrack module (No such file or directory)
09-13 08:50:30.026 1880-1880/? E/android.os.Debug: failed to load memtrack module: -2
09-13 08:50:32.090 1899-1899/? E/cutils-trace: Error opening trace file: No such file or directory (2)
09-13 08:50:32.300 1899-1899/? E/memtrack: Couldn't load memtrack module (No such file or directory)
09-13 08:50:32.300 1899-1899/? E/android.os.Debug: failed to load memtrack module: -2
09-13 08:50:35.356 1913-1913/? E/cutils-trace: Error opening trace file: No such file or directory (2)
09-13 08:50:35.573 1911-1911/? E/memtrack: Couldn't load memtrack module (No such file or directory)
09-13 08:50:35.573 1911-1911/? E/android.os.Debug: failed to load memtrack module: -2
09-13 08:50:37.811 150-150/? E/libEGL: called unimplemented OpenGL ES API
09-13 08:50:37.811 150-150/? E/SurfaceFlinger: glCheckFramebufferStatusOES error 0
09-13 08:50:37.812 150-150/? E/SurfaceFlinger: got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot
09-13 09:00:00.843 412-429/system_process E/BatteryStatsService: no controller energy info supplied
09-13 09:00:00.848 412-429/system_process E/KernelWakelockReader: neither /proc/wakelocks nor /d/wakeup_sources exists
09-13 08:52:02.318 412-478/system_process E/TaskPersister: File error accessing recents directory (directory doesn't exist?).
09-13 08:51:58.902 155-155/? E/Camera2Client: notifyError: Error condition 0 reported by HAL, requestId -1
09-13 08:50:39.321 155-1838/? E/V4L2CameraHAL: virtual int v4l2_camera_hal::V4L2Camera::setupStreams(camera3_stream_configuration_t *):380: V4L2 only supports 1 stream configuration at a time (stream 0 is format 34, width 640, height 480, stream 1 is format 33, width 320, height 240).
09-13 08:50:39.321 155-1838/? E/Camera: int default_camera_hal::Camera::configureStreams(camera3_stream_configuration_t *):0: Failed to setup stream set
09-13 08:50:39.321 155-1838/? E/Camera3-Device: Camera 0: configureStreamsLocked: Set of requested inputs/outputs not supported by HAL
09-13 08:50:39.321 155-1838/? E/Camera3-Device: Camera 0: setUpRequestLocked: Can't set up streams: Invalid argument (-22)
09-13 08:50:39.321 155-1838/? E/Camera3-Device: Camera 0: convertMetadataListToRequestListLocked: Can't create capture request
09-13 08:50:39.321 155-1838/? E/Camera2-StreamingProcessor: startStream: Camera 0: Unable to set preview request to start preview: Invalid argument (-22)
09-13 08:50:39.321 155-1838/? E/Camera2Client: startPreviewL: Camera 0: Unable to start streaming preview: Invalid argument (-22)
09-13 08:50:39.262 162-1964/? E/FileSource: Failed to open file '/system/media/audio/ui/VideoRecord.ogg'. (No such file or directory)
09-13 08:50:39.262 162-1964/? E/GenericSource: Failed to create data source!
09-13 08:50:39.262 155-1838/? E/MediaPlayer: error (1, -2147483648)
09-13 08:50:39.266 162-1966/? E/FileSource: Failed to open file '/system/media/audio/ui/VideoStop.ogg'. (No such file or directory)
09-13 08:50:39.266 162-1966/? E/GenericSource: Failed to create data source!

android.permission.CAMERA權限是一種危險的權限,通常要求用戶在運行時在標准Android上進行授予。 在Android Things中,這些權限會自動授予,但只能在設備啟動時授予。 您需要執行以下一項操作才能將該權限授予您的應用程序:

  1. 首次安裝后重新啟動設備。 這將授予重新啟動權限。

  2. 第一次使用adb install -g <APK>手動adb install -g <APK> 該標志授予所有請求的安裝許可,因此可以避免重新啟動。

  3. 升級到Android Studio 3.0,它將自動為您授予安裝的這些權限,因此您無需執行#1或#2。

我正在使用CSI相機在Raspiberry 3B上使用AndroidThing。 當我使用Android Camera1 API嘗試打開相機時,發現一些錯誤,例如

無法在運行AndroidThings的Raspberry Pi上使用Android Camera(1)API連接相機

所以我嘗試使用Android Camera2 API。 嘗試創建預覽並捕獲2個流會話時出現錯誤。我發現此問題:37130806

它說Raspberry Pi相機HAL是使用V4L2實現的。 不幸的是,V4L2接口與Android HAL要求並不完全兼容。 值得注意的是,V4L2並不正式支持同時配置多個流。

所以也許就是這個問題

據我所知,android東西目前不支持圖形:硬件加速,因為默認情況下未啟用。 根據問題

 javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view);
    javaCameraView.setVisibility(SurfaceView.VISIBLE);
    javaCameraView.setCvCameraViewListener(this);

設置SurfaceView時需要硬件加速。 檢查這取決於OpenGL ES

因此,為了使其啟動並運行,需要執行以下操作。

        mCameraThread = new HandlerThread("CameraBackground");

    mCameraThread.start();

    mCameraHandler = new Handler(mCameraThread.getLooper());

    mCamera = RCamera.getInstance();

    mCamera.initializeCamera(this, mCameraHandler, mOnImageAvailableListener);

    takePicHandler = new Handler();

    takePicHandler.post(runnable);

和處理程序以及ImageReader.OnImageAvailableListener將像

    private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        Log.println(Log.INFO, "runnable", "running");

        mCamera.takePicture();

        takePicHandler.postDelayed(runnable, 0);

    }
};

private ImageReader.OnImageAvailableListener mOnImageAvailableListener =
        new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                Image image = reader.acquireLatestImage();
                // get image bytes
                ByteBuffer imageBuf = image.getPlanes()[0].getBuffer();

                final byte[] imageBytes = new byte[imageBuf.remaining()];

                imageBuf.get(imageBytes);

                image.close();

                onPictureTaken(imageBytes);
            }
        };

這將與android東西和RPI3一起正常工作,加油!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM