【问题标题】:Android Camera: How to process byte data in onPictureTaken using openCVAndroid相机:如何使用openCV处理onPictureTaken中的字节数据
【发布时间】:2023-03-25 04:25:02
【问题描述】:

我正在尝试处理来自 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 复制而来的。当数据以Camera.PreviewCallback 进入onPreviewFrame(byte[] frame, Camera camera) 时,它工作得很好。但是在上面的Camera.PictureCallbacklike 中,我得到了错误的图像。

拍摄完图片后,我将它显示在一个ResultActivity中,如下图:左边是来自预览并且正确,右边是来自图片并且错误(绿色)。

我已经将图像格式更改为在预览和图片中相同 (ImageFormat.NV21),但这并没有什么不同。图片的图片格式是ImageFormat.JPEG我不改的话。

所以问题是:如何将数据转换为 Mat 以在 onPictureTaken 中获得正确的图像,就像在 onPreviewFrame 中一样?

感谢您的任何想法!

编辑: 我不想将图像保存到磁盘,也不想将其转换为位图。

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    这行得通:

            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 会变魔术!

    顺便说一下,不需要更改图像格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多