您好我尝试使用Android的PreviewCallback在捕获OnPreviewFrame的帧上使用opencv执行某些处理。我遇到的问题是在测试处理之前一切正常,将byte []设置为Mat然后将Mat设置为位图时,位图看起来像色噪声。
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Mat color = new Mat(480,640, CvType.CV_8UC1);
color.put(0, 0, data);
Mat imageMat = new Mat(480,640,CvType.CV_8UC1);
Bitmap bmpOut = Bitmap.createBitmap(color.width(),color.height(),
Bitmap.Config.ARGB_8888);
Imgproc.cvtColor(color,imageMat, Imgproc.COLOR_YUV420sp2RGBA);
Utils.matToBitmap(imageMat,bmpOut,true);
image.setImageBitmap(bmpOut);
}
非常感谢任何帮助!
答案 0 :(得分:2)
实际上,Mat
的大小不应该是所选预览的大小。
矩阵的宽度需要比预览尺寸大1.5倍,如下所示:
// Copy preview data to a new Mat element
Mat mYuv = new Mat(frameHeight + frameHeight / 2, frameWidth, CvType.CV_8UC1);
mYuv.put(0, 0, data);
之后,为了创建一个我通常做的位图:
// Convert preview frame to rgba color space
final Mat mRgba = new Mat();
Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV2BGR_NV12, 4);
// Converts the Mat to a bitmap.
Bitmap bitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(img, bitmap);
matToBitmap
方法是一种实用工具方法,在转换为Bitmap时节省了大量精力,因此我强烈建议您将其用作自己创建的对象。