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

标签 android opencv bitmap android-bitmap opencv3.1

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

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

图片

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

最佳答案

您错误地转换了图像。

如果您希望位图是彩色图像,则不需要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);

关于android - 如何在保留颜色的同时将 Mat 对象转换为位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39957955/

相关文章:

java - 类型转换为 Dalvik 格式失败 : Unable to execute dex: java. nio.BufferOverflowException

android - gradle copy as doLast 不工作

python - 制作opencv时出错

python - 我的 OpenCV remap()ing 有什么问题?

android - picasso - 如何获得真实的图像尺寸?

android - 如何将 google app-engine 应用程序与我的 android 连接?

Android 将字节码转换为 dex : Cause: Dex cannot parse version 52 byte code 时出错

c - 如何从 C 中的图像读取 EAN-13 条形码?

c# - 如何在点击事件中绘制图像?

flash - 如何获得透明度以在 Actionscript 中处理位图