OpenCV之Mat与Bitmap之间的转换
我们想在Android平台上开发OPenCV(处理图像);避免不了显示,通常在Android当中展示图像都是通过ImageView这个控件,当然展示的方式也有几种,在下面的内容中会简单介绍一下。但是我们在上一篇中关于Mat介绍中知道,OpenCV处理的是Mat对象,所以,为了接下来的工作更容易,我们本篇就要看一下Bitmap和Mat之间转换实现。
1 ImageView展示图像的实现方式
imageView.setImageBitmap();
imageView.setImageDrawable();
imageView.setBackground();
2 Bitmap与Mat之间转换
2.1 Utils
在OpenCV4Android的SDK中,为了开发方便,里面专门提供了两者之间的转换API Utils,下面我们就来看看这个工具类究竟有什么可以调用的接口:
static void
|
bitmapToMat(android.graphics.Bitmap bmp, Mat mat)
Short form of the bitmapToMat(bmp, mat, unPremultiplyAlpha=false). |
static void
|
bitmapToMat(android.graphics.Bitmap bmp, Mat mat, boolean unPremultiplyAlpha)
Converts Android Bitmap to OpenCV Mat. |
static java.lang.String
|
exportResource(android.content.Context context, int resourceId)
|
static java.lang.String
|
exportResource(android.content.Context context, int resourceId, java.lang.String dirname)
|
static Mat
|
loadResource(android.content.Context context, int resourceId)
|
static Mat
|
loadResource(android.content.Context context, int resourceId, int flags)
|
static void
|
matToBitmap(Mat mat, android.graphics.Bitmap bmp)
Short form of the matToBitmap(mat, bmp, premultiplyAlpha=false) |
static void
|
matToBitmap(Mat mat, android.graphics.Bitmap bmp, boolean premultiplyAlpha)
Converts OpenCV Mat to Android Bitmap. |
从其方法列表中可以看出,其完完全全就是一个工具类,全是静态方法;且就是为了实现Mat与Bitmap转换而设计的。
现在我们就来抽取其中两个详细讲解一下:
(1)public static void bitmapToMat(android.graphics.Bitmap bmp, Mat mat, boolean unPremultiplyAlpha)
官方释义:
This function converts an Android Bitmap image to the OpenCV Mat.
'ARGB_8888' and 'RGB_565' input Bitmap formats are supported.
The output Mat is always created of the same size as the input Bitmap and of the 'CV_8UC4' type, it keeps the image in RGBA format.
This function throws an exception if the conversion fails.
Parameters:
bmp
- is a valid input Bitmap object of the type 'ARGB_8888' or 'RGB_565'.
mat
- is a valid output Mat object, it will be reallocated if needed, so it may be empty.
unPremultiplyAlpha
- is a flag, that determines, whether the bitmap needs to be converted from alpha premultiplied format (like Android keeps 'ARGB_8888' ones) to regular one; this flag is ignored for 'RGB_565' bitmaps.
简译:实现Bitmap图像转Mat,支持'ARGB_8888' 和 'RGB_565'像素类型,输出的Mat类型默认是CV_8UC4类型,大小和Bitmap一样,通道顺序为RGBA。最后一个参数对于RGB_565类型Bitmap无效,当类型为ARGB_8888时,决定是否保留透明度属性。
(2)public static void matToBitmap(Mat mat, android.graphics.Bitmap bmp, boolean premultiplyAlpha)
官方释义:
This function converts an image in the OpenCV Mat representation to the Android Bitmap.
The input Mat object has to be of the types 'CV_8UC1' (gray-scale), 'CV_8UC3' (RGB) or 'CV_8UC4' (RGBA).
The output Bitmap object has to be of the same size as the input Mat and of the types 'ARGB_8888' or 'RGB_565'.
This function throws an exception if the conversion fails.
Parameters:
mat
- is a valid input Mat object of types 'CV_8UC1', 'CV_8UC3' or 'CV_8UC4'.
bmp
- is a valid Bitmap object of the same size as the Mat and of type 'ARGB_8888' or 'RGB_565'.
premultiplyAlpha
- is a flag, that determines, whether the Mat needs to be converted to alpha premultiplied format (like Android keeps 'ARGB_8888' bitmaps); the flag is ignored for 'RGB_565' bitmaps.
简译:略
2.2 示例
下面就来结合示例来说明一下在实际开发中使用的流程,其实整个流程通常是设备获取图片转化为BItmap对象,调用OpenCV Utils工具类转换为Mat对象,然后对Mat经过一系列处理之后再转为Bitmap对象,通过其他的图像显示载体展示出来(我们这里就是ImageView)
关于Bitmap到Mat的转换,可以参见第一篇中搭建OpenCV开发环境最后的示例--灰度图像处理,下面主要实现Mat到Bitmap的转换,先看一下效果图。
实现的主要逻辑代码如下:
mat = mat.setTo(new Scalar(Double.parseDouble(rtext.getText().toString()),Double.parseDouble(gtext.getText().toString()),Double.parseDouble(btext.getText().toString()),Double.parseDouble(atext.getText().toString())));Log.e(TAG, "generateColor: "+imageView.getHeight() );mat.create(new Size(imageView.getWidth(), imageView.getHeight()), CvType.CV_8UC4);//当前Mat与Bitmap转换,只支持ARGB_8888和RGB_565Bitmap bitmap = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888);Utils.matToBitmap(mat, bitmap,true);//添加透明度imageView.setImageBitmap(bitmap);
有时候,我们还想把Mat对象存储为常用的图片格式,可以通过如下方式实现:
public void saveMatData(Mat mat,String filePath) {File file = new File(filePath);if (!file.exists()) {file.mkdir();}//注意 Imgcodecs的imread()和imwrite()方法读取颜色值通道的顺序都是BGRImgcodecs.imwrite(filePath, mat);}
好了,关于两者之间的转换就介绍到这里了;我们主要使用的就是Utils这个工具类,所以只要搞明白它里面的几个方法就可以了。更多内容请查看:
上一篇:OpenCV中Mat与Android中Bitmap简介
下一篇:OpenCV之基本绘图(在Mat和Bitmap上)
OpenCV之Mat与Bitmap之间的转换相关推荐
- CvMat、Mat、IplImage之间的转换详解及实例
IplImage: 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构: 在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写 ...
- assets bitmap 转_图片文件和Bitmap之间的转换
图片文件转为Bitmap对象 String filePath="c:/01.jpg"; Bitmap bitmap=BitmapFactory.decodeFile(filePat ...
- android图片转换为二进制流,Android图片二进制与Bitmap、Drawable之间的转换
Android图片二进制与Bitmap.Drawable之间的转换 Java代码 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutput ...
- OpenCV中图像Mat,二维指针和CxImage类之间的转换
在做图像处理中,常用的函数接口有Opencv中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- 【OpenCV】OpenCV函数精讲之 -- Mat和IplImage之间的相互装换(OpenCV2.0和OpenCV3.0)
Mat是OpenCV和C++接口的矩阵类,IplImage是OpenCV和C语言接口的结构体. Mat读取显示用的是imread.imshow等,IplImage读取显示用的是cvLoadImage( ...
- OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- mat opencv java_OpenCV Mat到JavaCV Mat转换
您可以使用java.awt.image.BufferedImage作为接口. 您org.opencv.core.Mat对象只是转换为java.awt.image.BufferedImage中再取结果对 ...
- opencv将图像处理之后显示在label上(Mat转化为qimage)转换之后label显示全黑
opencv将图像处理之后显示在label上(Mat转化为qimage)转换之后label显示全黑 1.本实验要完成的功能:利用opencv将原图像灰度处理,然后显示在label上 2.图像处理程序: ...
最新文章
- java如何重写_java中如何重写一个方法
- InstallShield9中开始菜单的设置
- AI Studio下C语言编程:一道简单的C语言作业题目
- Wireshark抓包与常见问题解决
- vs code设置支持jsx支持emmet
- php header调试,yii2打log
- how is home button implemented in Fiori launchpad
- 猴子排圈求最后编号问题
- linux 下 安装 phpstorm
- 基于微服务的软件架构模式
- 六维图见过么?Python 画出来了!
- Linux DNS服务详解——DNS基础知识
- void指针(void*)用法
- 图像补全(image inpainting)
- linux下查看网卡vid,Linux下查看USB设备的VID、PID命令
- android graphics,Android graphics值Bitmap
- Android自定义日历控件(附效果图)
- 【全角/半角是什么】关于全角和半角的区别和使用
- html中斜体样式怎么写,css font-style字体斜体样式
- 谋杀案和杨辉三角改进版
热门文章
- 虚幻3(导演动画)二触发音效
- spring cloud 2021 gateway 报错503 Service Unavailable
- linux dhcp option43,Linux DHCP通过OPTION43为H3C的AP下发AC地址
- 3D炫酷雪花背景的实现
- 偷窥JAVA字符串三姐妹-String、StringBuffer、StringBuilder
- 僵尸网络:大些并不总是好事
- Spark 生成 janusgraph adjacent list
- 北京二手房成交继续低迷 有豪宅每周降价300万
- 用Java实现“美女选妃”
- .NET6: 开发基于WPF的摩登三维工业软件 (7)