我正在尝试处理来自JpegImageCallback
的图像
mContentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mContentView.getCamera().setPreviewCallback(null);
mContentView.getCamera().takePicture(null, null, new JpegImageCallback());
}
});
JpegImageCallback
看起来像这样
class JpegImageCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "onPictureTaken: I am here! data.length=" + data.length);
Camera.Parameters params = camera.getParameters();
int fw = params.getPictureSize().width;
int fh = params.getPictureSize().height;
Log.d(TAG, "onPictureTaken: PictureFormat: " + params.getPictureFormat()); /* ImageFormat.NV21 */
Log.d(TAG, "onPictureTaken: PreviewFormat: " + params.getPreviewFormat()); /* ImageFormat.NV21 */
/* conversion data to Mat */
Mat mYuvFrameData = new Mat(fh + (fh/2), fw, CvType.CV_8UC1);
mYuvFrameData.put(0, 0, data);
Mat rgbImage = new Mat();
Imgproc.cvtColor(mYuvFrameData, rgbImage, Imgproc.COLOR_YUV2RGBA_NV21, 4);
Mat gryImage = mYuvFrameData.submat(0, fh, 0, fw);
}
}
从数据到org.opencv.core.Mat
的转换是从org.opencv.android.JavaCameraView
复制的。当数据进入onPreviewFrame(byte[] frame, Camera camera)
中的Camera.PreviewCallback
中时,它完全可以正常工作。但是在上面的Camera.PictureCallback
中,我得到了错误的图像。
拍摄图像后,我将其显示在ResultActivity中,如下所示:左边是预览和正确的图像,右边是图片的图像和错误的图像(绿色)。
我已经将图像格式更改为在预览和图片(ImageFormat.NV21
)中相同,但这没什么区别。如果我不更改图片的图片格式,则为ImageFormat.JPEG
。
所以问题是:如何像onPictureTaken
一样将数据转换为Mat以在onPreviewFrame
中获得正确的图像?
感谢任何想法!
编辑: 我不想将图像保存到磁盘,也不想将其转换为位图。
答案 0 :(得分:0)
这有效:
Mat mat = new Mat(new Size(fw, fh), CvType.CV_8U);
mat.put(0, 0, data);
Mat rgbImage = Imgcodecs.imdecode(mat, Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
Mat gryImage = new Mat();
Imgproc.cvtColor(rgbImage, gryImage, Imgproc.COLOR_RGB2GRAY);
在这里找到它:How to retrieve a new picture taken by the camera as OpenCV Mat on Android?
Imgcodecs.imdecode
发挥了所有魔力!
顺便说一句,无需更改图像格式。