4通道IplImage javacv到android位图
我试图通过检查相机预览的每一帧来录制视频,并将其转换为具有ARGB_8888质量的位图。由于需要4个通道,因此也使用通道4创建了IplImage。现在输出有两个主要问题: 1) 从IplImage创建的位图具有灰度。即使我把它从BGR2RGBA转换过来。 2) 4通道IplImage给我提供了一个相同屏幕的位图(分为4部分) 让我把代码放在这里4通道IplImage javacv到android位图,android,opencv,bitmap,javacv,iplimage,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) {
@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个部分的输出
我的代码有什么问题,或者我遗漏了什么?让我知道你最好的建议
谢谢,相机预览数据通常是YUV格式,因此我们需要将其转换为RGB,就像我在这里的答案中所示:@SamuelAudet:Hi samuel谢谢你的回答。但它不起作用。对于您的解决方案,我必须使用配置RGB_565获取位图对象,因为我们已经使用通道3创建了IPLImage。N它在我更新时提供输出图像。@SamuelAudet:请检查我更新的代码和图像。@SamuelAudet:我必须强制使用位图到RGB_565,我不能使用ARGB_8888。但我认为我们只能使用ARGB_8888来获取位图的质量。
cvtcolor()
还支持像CV_BGR2BGR565
这样的转换,所以请尝试一下。
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);