如何在保留颜色的同时将 Mat 对象转换为位图?

2024-03-13

在我正在开发的应用程序中,我使用打开相机OpenCV4Android using CameraBridgeViewBase.CvCameraViewListener2当我触摸屏幕时,我将该框架设置为内部的图像ImageView如下代码所示。 问题是图像设置为imageview始终与相机上预览的颜色不同,如图所示。我相信这个问题与我所做的转换有关,如下面的代码所示

我的问题是如何将 Mat 对象转换为Bitmap保持相同的颜色?

pic

enter image description here code:

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    Log.w(TAG, "onCameraFrame");
    if (mRGBT != null) {
        mRGBT.release();
    }

    mRGBT = inputFrame.rgba().t();
    Core.flip(mRGBT, mRGBT, 1);
    Imgproc.resize(mRGBT, mRGBT, inputFrame.rgba().size());

    if (touched) {
        touched = false;
        Imgproc.cvtColor(mRGBT, mRGBT, CvType.CV_8U);
        final Bitmap bitmap = Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565);
        Utils.matToBitmap(mRGBT, bitmap);

        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mIV.setImageBitmap(bitmap);
            }
        });
    }

    return mRGBT;
}

您错误地转换了图像。

如果您希望位图是彩色图像,则不需要cvtColor. inputFrame.rgba()返回一个 RGBA Mat,这就是您需要的输入Utils.matToBitmap (See JavaDoc http://docs.opencv.org/java/3.1.0/org/opencv/android/Utils.html#matToBitmap-org.opencv.core.Mat-android.graphics.Bitmap-boolean-).

if (touched) {
    touched = false;
    final Bitmap bitmap = 
            Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565);
    Utils.matToBitmap(mRGBT, bitmap);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mIV.setImageBitmap(bitmap);
        }
    });
}

如果您希望位图成为灰度图像,请使用Imgproc.COLOR_BGRA2GRAY:

if (touched) {
    touched = false;
    Imgproc.cvtColor(mRGBT, mRGBT, Imgproc.COLOR_BGRA2GRAY);
    final Bitmap bitmap = 
            Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565);
    Utils.matToBitmap(mRGBT, bitmap);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mIV.setImageBitmap(bitmap);
        }
    });
}

如果您需要使用位图Bitmap.Config.ARGB_8888 add true作为第三个参数Utils.matToBitmap,因此 Mat 被转换为 alpha 预乘格式(参见JavaDoc http://docs.opencv.org/java/3.1.0/org/opencv/android/Utils.html#matToBitmap-org.opencv.core.Mat-android.graphics.Bitmap-boolean-).

final Bitmap bitmap =
        Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mRGBT, bitmap, true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在保留颜色的同时将 Mat 对象转换为位图? 的相关文章

随机推荐