0

DJI からカメラを取得して OpenCV を使用しようとしています。問題は、ドローンがアクティブなときに DJI が記録しているビデオ プレビューアを取得するために OpenCv を設定する方法に依存しています。ドローンは実際にビデオを携帯電話にストリーミングしようとしていますが、OpenCV コードを使用して、Android Studio にあるプロジェクトのレイアウトからビデオ プレビュー ID を取得しようとすると、アプリケーションに移動しようとするたびにアプリがクラッシュします。アプリのカメラビュー部分。以下は、DJI カメラでキャプチャされたビデオ プレビューアに対して OpenCv オブジェクトを初期化するために使用するコードです。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setContentView(R.layout.activity_main);

    openCvCameraView = (JavaCameraView)findViewById(R.id.video_previewer_surface);
    openCvCameraView.setVisibility(SurfaceView.VISIBLE);
    openCvCameraView.setCvCameraViewListener(this);

    initUI();

    // The callback for receiving the raw H264 video data for camera live view
    mReceivedVideoDataCallBack = new CameraReceivedVideoDataCallback() {

        @Override
        public void onResult(byte[] videoBuffer, int size) {
            if(mCodecManager != null){
                // Send the raw H264 video data to codec manager for decoding
                mCodecManager.sendDataToDecoder(videoBuffer, size);
            }else {
                Log.e(TAG, "mCodecManager is null");
            }
        }
    };

    DJICamera camera = FPVDemoApplication.getCameraInstance();

    if (camera != null) {

        camera.setDJICameraUpdatedSystemStateCallback(new DJICamera.CameraUpdatedSystemStateCallback() {
            @Override
            public void onResult(CameraSystemState cameraSystemState) {
                if (null != cameraSystemState) {

                    int recordTime = cameraSystemState.getCurrentVideoRecordingTimeInSeconds();
                    int minutes = (recordTime % 3600) / 60;
                    int seconds = recordTime % 60;

                    final String timeString = String.format("%02d:%02d", minutes, seconds);
                    final boolean isVideoRecording = cameraSystemState.isRecording();

                    MainActivity.this.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {

                            recordingTime.setText(timeString);

                            /*
                             * Update recordingTime TextView visibility and mRecordBtn's check state
                             */
                            if (isVideoRecording){
                                recordingTime.setVisibility(View.VISIBLE);
                            }else
                            {
                                recordingTime.setVisibility(View.INVISIBLE);
                            }
                        }
                    });
                }
            }
        });

    }

}
4

1 に答える 1

0

この投稿によると、JavaCameraView を使用している可能性があります: What is the difference between `opencv.android.JavaCameraView` and `opencv.android.NativeCameraView`

このorg.opencv.android.JavaCameraViewクラスは、OpenCV ライブラリ内に実装されています。これは、SurfaceView を拡張し、標準の Android カメラ APIを使用する CameraBridgeViewBase から継承されます。

電話のハードウェア カメラではなく、DJI SDK からのビデオ フィードを使用しているため、OpenCV を呼び出したときに着信フィードと競合しているため、クラッシュが説明される場合があります。

私はドローンを持っていないので、私の唯一の提案は、ビデオ ストリームのデコードに関する他の DJI サンプルを見ることです。

https://github.com/DJI-Mobile-SDK-Tutorials/Android-VideoStreamDecodingSample

そして、ストリームをデコードする代わりに、データをおそらく JNI (C/C++) で OpenCV に送信します。

于 2016-10-26T04:28:00.373 に答える