在我正在开发的应用程序中,我使用OpenCV4Android
使用CameraBridgeViewBase.CvCameraViewListener2
打开相机,当我触摸屏幕时,我将该帧设置为内的图像>ImageView
如下代码所示。
问题是设置到 imageview
的图像始终与相机上的预览颜色不同,如图所示。我相信这个问题与我所做的转换有关,如下面的代码所示
我的问题是如何将 Mat 对象转换为保留相同颜色的位图?
图片
@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
所需的输入(请参阅 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/