1

onPreviewFrame(byte[] data, Camera camera) で Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV420sp2RGBA, 4 ) を使用してカメラ プレビュー YUV バイト配列を RGB(A) バイト配列に変換しようとすると、ランタイム エラーが発生します。

Preview.java:

     mCamera.setPreviewCallback(new PreviewCallback() {
          public void onPreviewFrame(byte[] data, Camera camera)
          {
            // Pass YUV data to draw-on-top companion
            System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length);
            mDrawOnTop.invalidate();
          }
       });

DrawOnTop.java:

public class DrawOnTop extends View {
Bitmap mBitmap;
Mat mYUV_Mat;
protected void onDraw(Canvas canvas) {
    if (mBitmap != null)
    {

        canvasWidth = canvas.getWidth();
        canvasHeight = canvas.getHeight();
        int newImageWidth = 640;
        int newImageHeight = 480;
        marginWidth = (canvasWidth - newImageWidth)/2;

        if( mYUV_Mat != null ) mYUV_Mat.release();

        //mYUV_Mat = new Mat( newImageWidth, newImageHeight, CvType.CV_8UC1 );
        mYUV_Mat = new Mat( newImageWidth, newImageHeight, CvType.CV_8UC4 );
        mYUV_Mat.put( 0, 0, mYUVData );

        //Mat mRgba_Mat = new Mat();
        Mat mRgba_Mat = new Mat(newImageWidth,newImageHeight,CvType.CV_8UC4);

        //Mat mRgba_Mat = mYUV_Mat;

        //Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV2RGBA_NV21, 4 );
        //Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV420sp2RGB, 4 );
        Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV420sp2RGBA, 4 );


        // Draw Bitmap New:
        Bitmap mBitmap = Bitmap.createBitmap( newImageWidth, newImageHeight, Bitmap.Config.ARGB_8888 );
        Utils.matToBitmap( mRgba_Mat, mBitmap );
        mRgba_Mat.release();
}
}

変換 mYUV_Mat.put( 0, 0, mYUVData ) は正しく実行されます。しかし、Imgproc.cvtColor を使用して mYUV_Mat を mRgb_Mat に変換しようとすると、実行時エラー (Eclipse では「ソースが見つかりません」) が発生します。

私の目標に対する正しい Imgproc.cvtColor コマンドは何ですか?

(画像処理が遅いため、Java YUV2RGB(A) デコード メソッドを使用したくありません。ネイティブ呼び出しを実行できるため、OpenCV Imgproc.cvtColor メソッドを使用したい)

4

1 に答える 1

6

ライブラリがプロジェクトに適切に含まれていない可能性がありますが、他のOpenCVImgprocライブラリは含まれていますか? クラッシュする行は、 のメソッドを使用する最初の行ですImgproc。これにより、コードの前半部分が正しく実行される理由が説明されます。

引数なしのコンストラクターを使用できることを除いて、コードは問題ないように見えますmRgba_Mat(を含むほとんどの OpenCV4Android 関数cvtColorは、宛先マトリックスの必要なサイズを推測できるため) mYUV_Mat。YUV マトリックスに対応する RGB よりも 50% 多いスペースを割り当てるだけであれば、完全な 4 チャンネルは必要ありません。

mYUV_Mat = new Mat( newImageHeight + newImageHeight / 2, newImageWidth, CvType.CV_8UC1 );
于 2013-05-23T02:51:27.750 に答える