如何在保持颜色的同时将Mat对象转换为Bitmap?

时间:2016-10-10 12:08:28

标签: android opencv bitmap android-bitmap opencv3.1

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

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

PIC

enter image description here

@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;
}

2 个答案:

答案 0 :(得分:3)

您正在错误地转换图像。

如果您希望位图是彩色图像,则不需要cvtColorinputFrame.rgba()会返回RGBA Mat,这是Utils.matToBitmap所需的输入(请参阅JavaDoc)。

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添加true作为Utils.matToBitmap中的第三个参数,那么Mat将转换为alpha预乘格式(请参阅JavaDoc)。

final Bitmap bitmap =
        Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mRGBT, bitmap, true);

答案 1 :(得分:0)

我正在使用它并且工作正常:

Mat mat = inputFrame.rgba();
Bitmap bm = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mat, bm);