【问题标题】:How to convert the Mat object to a Bitmap while perserving the color?如何在保留颜色的同时将 Mat 对象转换为位图?
【发布时间】:2017-02-18 20:32:58
【问题描述】:

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

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

图片

代码

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

【问题讨论】:

  • OpenCV 适用于 BGR 图像。您将帧转换为 RGB。
  • 正如丹所说的颜色顺序不正确,您的红色和蓝色通道的顺序不同
  • @DanMašek 你的意思是这一行:Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565);..如果这就是你的意思,那就有BGR 没有选择!!

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


【解决方案1】:

您正在错误地转换图像。

如果您希望位图是彩色图像,则不需要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,请在Utils.matToBitmap 中添加true 作为第三个参数,以便将Mat 转换为alpha 预乘格式(请参阅JavaDoc)。

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

【讨论】:

    【解决方案2】:

    我正在使用它,它工作正常:

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

    【讨论】:

    • 实际上我在使用 Bitmap.Config.ARGB_8888 时遇到了同样的问题
    • @user2121 尝试一步一步删除之前的代码,找出问题所在
    • 我应该怎么做才能扭转这个我的意思是位图到输入帧
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2016-04-26
    • 2015-09-22
    • 2016-05-18
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多