使用android相机捕获图像后将Bitmap转换为Mat
Posted
技术标签:
【中文标题】使用android相机捕获图像后将Bitmap转换为Mat【英文标题】:convert Bitmap to Mat after capture image using android camera 【发布时间】:2013-06-27 17:41:22 【问题描述】:Mat b = new Mat();
Bitmap bmp = getIntent().getExtras().getParcelable("image_send");
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_image);
Mat tmp = new Mat (bmp.getWidth(), bmp.getHeight(), CvType.CV_8UC1);
Utils.bitmapToMat(bmp, tmp);
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY);
//Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_GRAY2RGB, 4);
Utils.matToBitmap(tmp, bmp);
iv = (ImageView) findViewById(R.id.imageView1);
iv.setImageBitmap(bmp);
无法显示 bmp。我的应用在拍照后停止了。
【问题讨论】:
你不能在onCreate中使用opencv代码(原生so还没有加载) 【参考方案1】:Utils.bitmapToMat
将 android 位图转换为 OpenCV Mat。它需要ARGB_8888
或RGB_565
类型的位图。
import org.opencv.android.Utils;
Mat mat = new Mat();
Bitmap bmp32 = bmp.copy(Bitmap.Config.ARGB_8888, true);
Utils.bitmapToMat(bmp32, mat);
【讨论】:
Bitmap bmp32 = bmp.copy(Bitmap.Config.ARGB_8888, true);
这行有什么用?为什么我不能只做Utils.bitmapToMat(bmp, mat);
?
我真的需要帮助解决这个问题,你能帮帮我吗? ***.com/questions/61216402/…
我可以回答上面的问题。 bitmapToMat 仅接受某些位图类型。这确保它是 ARGB_8888。如果格式错误,您的垫子上会出现垃圾。【参考方案2】:
使用Camera2
这个任务非常快,只需要在YUV_420_888
上配置ImageReader
和ImageFormat
,然后像这样使用OpenCV
处理帧:
// You can read image with differents patterns for example grayscale:
Mat mGray(height, width, cv::IMREAD_GRAYSCALE, pFrameData);
下一个答案中的完整实现:https://***.com/a/49331546/471690
【讨论】:
【参考方案3】:我的应用也有同样的问题。在主要活动中,我必须使 OpenCV 可用。 (我假设您的应用在使用 Mat 库时引发了链接错误)。 所有示例应用程序都执行此操作。将此包含在您的主要活动中。
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this)
@Override
public void onManagerConnected(int status)
switch (status)
case LoaderCallbackInterface.SUCCESS:
Log.i("OpenCVManager setup", "OpenCV loaded successfully");
//Use openCV libraries after this
break;
default:
super.onManagerConnected(status);
break;
;
@Override
public void onResume()
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this,
mLoaderCallback);
【讨论】:
【参考方案4】:Mat tmp = new Mat (bmp.getWidth(), bmp.getHeight(), CvType.CV_8UC1);
OpenCV Mat 构造函数需要行、列对而不是宽度、高度作为其参数,将它们反转。
试试:
Mat tmp = new Mat (bmp.getHeight(), bmp.getWidth(), CvType.CV_8UC1);
【讨论】:
也是类型不对,转换的时候图片还是color+alpha (CV_8UC4)以上是关于使用android相机捕获图像后将Bitmap转换为Mat的主要内容,如果未能解决你的问题,请参考以下文章