我们想在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之间的转换相关推荐

  1. CvMat、Mat、IplImage之间的转换详解及实例

    IplImage: 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构: 在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写 ...

  2. assets bitmap 转_图片文件和Bitmap之间的转换

    图片文件转为Bitmap对象 String filePath="c:/01.jpg"; Bitmap bitmap=BitmapFactory.decodeFile(filePat ...

  3. android图片转换为二进制流,Android图片二进制与Bitmap、Drawable之间的转换

    Android图片二进制与Bitmap.Drawable之间的转换 Java代码 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutput ...

  4. OpenCV中图像Mat,二维指针和CxImage类之间的转换

    在做图像处理中,常用的函数接口有Opencv中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  5. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  6. 【OpenCV】OpenCV函数精讲之 -- Mat和IplImage之间的相互装换(OpenCV2.0和OpenCV3.0)

    Mat是OpenCV和C++接口的矩阵类,IplImage是OpenCV和C语言接口的结构体. Mat读取显示用的是imread.imshow等,IplImage读取显示用的是cvLoadImage( ...

  7. OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  8. mat opencv java_OpenCV Mat到JavaCV Mat转换

    您可以使用java.awt.image.BufferedImage作为接口. 您org.opencv.core.Mat对象只是转换为java.awt.image.BufferedImage中再取结果对 ...

  9. opencv将图像处理之后显示在label上(Mat转化为qimage)转换之后label显示全黑

    opencv将图像处理之后显示在label上(Mat转化为qimage)转换之后label显示全黑 1.本实验要完成的功能:利用opencv将原图像灰度处理,然后显示在label上 2.图像处理程序: ...

最新文章

  1. java如何重写_java中如何重写一个方法
  2. InstallShield9中开始菜单的设置
  3. AI Studio下C语言编程:一道简单的C语言作业题目
  4. Wireshark抓包与常见问题解决
  5. vs code设置支持jsx支持emmet
  6. php header调试,yii2打log
  7. how is home button implemented in Fiori launchpad
  8. 猴子排圈求最后编号问题
  9. linux 下 安装 phpstorm
  10. 基于微服务的软件架构模式
  11. 六维图见过么?Python 画出来了!
  12. Linux DNS服务详解——DNS基础知识
  13. void指针(void*)用法
  14. 图像补全(image inpainting)
  15. linux下查看网卡vid,Linux下查看USB设备的VID、PID命令
  16. android graphics,Android graphics值Bitmap
  17. Android自定义日历控件(附效果图)
  18. 【全角/半角是什么】关于全角和半角的区别和使用
  19. html中斜体样式怎么写,css font-style字体斜体样式
  20. 谋杀案和杨辉三角改进版

热门文章

  1. 虚幻3(导演动画)二触发音效
  2. spring cloud 2021 gateway 报错503 Service Unavailable
  3. linux dhcp option43,Linux DHCP通过OPTION43为H3C的AP下发AC地址
  4. 3D炫酷雪花背景的实现
  5. 偷窥JAVA字符串三姐妹-String、StringBuffer、StringBuilder
  6. 僵尸网络:大些并不总是好事
  7. Spark 生成 janusgraph adjacent list
  8. 北京二手房成交继续低迷 有豪宅每周降价300万
  9. 用Java实现“美女选妃”
  10. .NET6: 开发基于WPF的摩登三维工业软件 (7)