4通道IplImage javacv到android位图

时间:2014-04-18 07:52:53

标签: android opencv bitmap javacv iplimage

我正在尝试通过检查相机预览的每一帧到质量ARGB_8888的位图来录制视频。因为它需要4个通道,也创建了带通道4的IplImage。现在输出有两个主要问题:

1)从IplImage创建的位图具有灰度。即使我已经从BGR2RGBA转换它。 2)4通道IplImage给了我相同屏幕的位图(分为4个部分)。

让我把我的代码放在这里。

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {

        if (yuvIplimage != null && recording) {
            videoTimestamp = 1000 * (System.currentTimeMillis() - startTime);


            // Where imagewidth = 640 and imageheight  = 480 (As per camera preview size)
            // Create the yuvIplimage 

            IplImage yuvimage = IplImage.create(imageWidth, imageHeight * 3 / 2, IPL_DEPTH_8U, 2);
            yuvimage.getByteBuffer().put(data);


            IplImage rgbimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 3);
            opencv_imgproc.cvCvtColor(yuvimage, rgbimage, opencv_imgproc.CV_YUV2BGR_NV21);

            Bitmap bitmap = Bitmap.createBitmap(imageWidth, imageHeight,Bitmap.Config.RGB_565);
            bitmap.copyPixelsFromBuffer(rgbimage.getByteBuffer());

            //Save file to SDCARD------------

            File file = new File(Environment.getExternalStorageDirectory(),
                    "rgbbitmap.png");
            FileOutputStream fOut;
            try {
                fOut = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
                fOut.flush();
                fOut.close();
                // mybitmap.recycle();

            } catch (Exception e) { // TODO

            }       


            try {

                // Get the correct time
                recorder.setTimestamp(videoTimestamp);

                // Record the image into FFmpegFrameRecorder
                recorder.record(yuvimage);

            } catch (FFmpegFrameRecorder.Exception e) {
                Log.v(LOG_TAG, e.getMessage());
                e.printStackTrace();
            }
        }
    }

同样,找到下面的位图图像,因为我得到4个相同帧的输出。

enter image description here

我的代码有什么问题或者我错过了什么?让我知道你最好的建议。

谢谢,

1 个答案:

答案 0 :(得分:0)

IplImage yuvImage = IplImage.create(width, height * 3 / 2, IPL_DEPTH_8U, 1);
yuvImage.getByteBuffer().put(data);
IplImage bgrImage = IplImage.create(width, height, IPL_DEPTH_8U, 3);
cvCvtColor(yuvImage, bgrImage, CV_YUV2BGR_NV21);
cvSaveImage("/mnt/sdcard/result.jpg", bgrImage);