做图像处理的时候经常使需要用到opencv的,这应该是免费的图像处理库中用得最广泛而且最好用的库了吧。然后有时候想用界面来展示点东西的时候,我们就需要编写个界面,编写界面的方法千千万,弱水三千我只取一瓢饮,所以我用Qt来写界面,这个时候,就会想,如果我用OpenCV处理后的图像不会还要用OpenCV的GUI来显示吧,虽然完全可以这么做,但是既然都有个界面了,为啥我们还要用两个窗口来显示呢,于是就有了让OpenCV处理后的图像在Qt写的的界面上显示。

最简单粗暴无脑的方法就是把OpenCV处理后的图像保存到本地,然后用Qt加载进来,简单粗暴(23333...T_T!!!)。所以后来我找到一些别人的方法,然后我自己再修改一下,就成了我现在一直在用的方法,感觉上还可以,所以就直接上代码吧...等等,还是说一下Mat和QImage都有哪些格式吧。

首先是cv::Mat,cv::Mat是OpenCV的图像数据类型,是一个类,具体的内容可以参考OpenCV的关于cv::Mat的API,这里要注意几个地方:

1、指向图像数据的指针:

uchar* cv::Mat::data

2、图像的行跟列:

int cv::Mat::rows
int cv::Mat::cols

3、数据类型,这个比较重要,在转为QImage的时候需要用到它来辨别数据格式。

int cv::Mat::type() const

OpenCV的图像数据格式如下:

typedef uint32_t     	uint 
typedef signed char  schar
typedef unsigned char  uchar
typedef unsigned short  ushort
typedef int64_t  int64
typedef uint64_t  uint64
#define  CV_BIG_INT(n)   n##LL
#define  CV_BIG_UINT(n)   n##ULL
#define  CV_CN_MAX   512
#define  CV_CN_SHIFT   3
#define  CV_DEPTH_MAX   (1 << CV_CN_SHIFT)
#define  CV_8U   0
#define  CV_8S   1
#define  CV_16U   2
#define  CV_16S   3
#define  CV_32S   4
#define  CV_32F   5
#define  CV_64F   6
#define  CV_USRTYPE1   7
#define  CV_MAT_DEPTH_MASK   (CV_DEPTH_MAX - 1)
#define  CV_MAT_DEPTH(flags)   ((flags) & CV_MAT_DEPTH_MASK)
#define  CV_MAKETYPE(depth, cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
#define  CV_MAKE_TYPE   CV_MAKETYPE
#define  CV_8UC1   CV_MAKETYPE(CV_8U,1)
#define  CV_8UC2   CV_MAKETYPE(CV_8U,2)
#define  CV_8UC3   CV_MAKETYPE(CV_8U,3)
#define  CV_8UC4   CV_MAKETYPE(CV_8U,4)
#define  CV_8UC(n)   CV_MAKETYPE(CV_8U,(n))
#define  CV_8SC1   CV_MAKETYPE(CV_8S,1)
#define  CV_8SC2   CV_MAKETYPE(CV_8S,2)
#define  CV_8SC3   CV_MAKETYPE(CV_8S,3)
#define  CV_8SC4   CV_MAKETYPE(CV_8S,4)
#define  CV_8SC(n)   CV_MAKETYPE(CV_8S,(n))
#define  CV_16UC1   CV_MAKETYPE(CV_16U,1)
#define  CV_16UC2   CV_MAKETYPE(CV_16U,2)
#define  CV_16UC3   CV_MAKETYPE(CV_16U,3)
#define  CV_16UC4   CV_MAKETYPE(CV_16U,4)
#define  CV_16UC(n)   CV_MAKETYPE(CV_16U,(n))
#define  CV_16SC1   CV_MAKETYPE(CV_16S,1)
#define  CV_16SC2   CV_MAKETYPE(CV_16S,2)
#define  CV_16SC3   CV_MAKETYPE(CV_16S,3)
#define  CV_16SC4   CV_MAKETYPE(CV_16S,4)
#define  CV_16SC(n)   CV_MAKETYPE(CV_16S,(n))
#define  CV_32SC1   CV_MAKETYPE(CV_32S,1)
#define  CV_32SC2   CV_MAKETYPE(CV_32S,2)
#define  CV_32SC3   CV_MAKETYPE(CV_32S,3)
#define  CV_32SC4   CV_MAKETYPE(CV_32S,4)
#define  CV_32SC(n)   CV_MAKETYPE(CV_32S,(n))
#define  CV_32FC1   CV_MAKETYPE(CV_32F,1)
#define  CV_32FC2   CV_MAKETYPE(CV_32F,2)
#define  CV_32FC3   CV_MAKETYPE(CV_32F,3)
#define  CV_32FC4   CV_MAKETYPE(CV_32F,4)
#define  CV_32FC(n)   CV_MAKETYPE(CV_32F,(n))
#define  CV_64FC1   CV_MAKETYPE(CV_64F,1)
#define  CV_64FC2   CV_MAKETYPE(CV_64F,2)
#define  CV_64FC3   CV_MAKETYPE(CV_64F,3)
#define  CV_64FC4   CV_MAKETYPE(CV_64F,4)
#define  CV_64FC(n)   CV_MAKETYPE(CV_64F,(n))

这里最最常见和默认的应该是:

#define     CV_8U   0    
#define     CV_8UC1   CV_MAKETYPE(CV_8U,1)
#define     CV_8UC3   CV_MAKETYPE(CV_8U,3)

然后因为有时候要用到浮点型数据,所以,可能我会用到:

#define    CV_32F    5 
#define    CV_64F    6
#define    CV_32FC1    CV_MAKETYPE(CV_32F,1)
#define    CV_32FC3    CV_MAKETYPE(CV_32F,3)
#define    CV_64FC1    CV_MAKETYPE(CV_64F,1)
#define    CV_64FC3    CV_MAKETYPE(CV_64F,3)

然后是QImage是Qt提供的图像类型之一,其数据类型有:

但是,对应上面cv::Mat的类型如下:

//单通道灰度图

CV_8UC1 == QImage::Format_Grayscale8

CV_8U == QImage::Format_Grayscale8

//三通道图

CV_8UC3 == QImage::Format_RGB888

基本上,有这几个类型的转换就够了的,好了,类型说完了,该上代码了:

QImage mat2qimage(const cv::Mat &mat)
{
if (mat.type() == CV_8UC1 || mat.type() == CV_8U)
{
    // Copy input Mat
    const uchar *pSrc = (const uchar*)mat.data;
    // Create QImage with same dimensions as input Mat
    QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
    return image;
}
// 8-bits unsigned, NO. OF CHANNELS = 3  
else if (mat.type() == CV_8UC3)
{
    // Copy input Mat
    const uchar *pSrc = (const uchar*)mat.data;
    // Create QImage with same dimensions as input Mat
    QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
    // Because of the BGR order in opencv, 
    // here the rgbSwapped() function is needed.
    return image.rgbSwapped();
}
}

如果要显示的是float或者fouble型的呢...那就转一下吧,应该,上面这两种会更常见一点吧。其实还有QImage转cv::Mat的方法的,但是我觉得...好像不是很有必要,毕竟我更倾向于用Open'CV做图像处理,然后用Qt带来显示。

草在结它的种子 

风在摇它的叶子 

我们站着,不说话

就十分美好

  -- 顾城

  

OpenCV和Qt的图像格式互转的更多相关文章

  1. Opencv与Qt (一)之运行测试读取图片

    刚刚在vs上装好了QT和Opencv,试一下效果把. 我简单的创建了一个label,然后使用Opencv导入图像,因为Opencv导入图像是MAT格式的,在使用Qt的时候我们要把导入的图像转换成Qim ...

  2. OpenCV与QT联合开发示例

    1.OpenCV及QT开发环境搭建 windows基于vs2017的opencv安装 windows下安装QT并与visual studio 2017搭建开发环境 2.工程创建 1.导入Qt项目 选择 ...

  3. OpenCV支持Qt用户界面

    在运行opencv程序的时候报下面的错误: ... The library is compiled without QT support in function ... 原因是在使用cmake安装op ...

  4. 使用opencv在Qt控件上播放mp4文件

    文章目录 简介 核心代码 运行结果 简介 opencv是一个开源计算机视觉库,功能非常多,这里简单介绍一下OpenCV解码播放Mp4文件,并将图像显示到Qt的QLabel上面. 核心代码 头文件 #i ...

  5. ubuntu 安装 OpenCv 及其Qt的开发环境配置

    ubuntu安装opencv (1)安装编译opencv的环境 sudo apt-get -y install build-essential cmake pkg-config (2)安装Image ...

  6. [OpenCV] Install openCV in Qt Creator

    Learn openCV.pdf qmake: link with opencv (Key Point) QT += core gui greaterThan(QT_MAJOR_VERSION, 4) ...

  7. ubuntu下opencv在Qt中的使用

    1. 编译安装OpenCV2.4.9  本博已有文章描述 2. 安装Qt和QtCreator 从qt-project.org 下载Qt安装文件 qt-opensource-linux-x64-5.4. ...

  8. OpenCV与QT联合编译 分类: Eye_Detection ZedBoard OpenCV shell ubuntu 2014-11-08 18:54 143人阅读 评论(0) 收藏

    问题1:首先参考rainysky的博客,发现qmake时发生找不到目录,文件的错误,又找不到 qmake.conf 文件的写法.所以开始按照网上的程序修改 XXX.pro 文件. 问题2:使用QT C ...

  9. (GO_GTD_2)基于OpenCV和QT,建立Android图像处理程序

    一.综述     如何采集图片?在windows环境下,我们可以使用dshow,在linux下,也有ffmpeg等基础类库,再不济,opencv自带的videocapture也是提供了基础的支撑.那么 ...

随机推荐

  1. 51nod 1055:最长等差数列

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  取消关注 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 ...

  2. 官网英文版学习——RabbitMQ学习笔记(九)总结

    RabbitMQ与spingboot相整合,主要步骤也很简单: 一.首先需要的是添加依赖 二.需要设置属性,属性主要是设置rabbitmq的地址端口,用户名密码回调等需要用到的一些常量,在整合过程中, ...

  3. Day4-T3

    原题目 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散 落民间几百年的珍宝——月亮之眼.吉儿深知“月亮之眼”价值连城:它是由许多珍珠相连而成的,工 匠们用金线连 ...

  4. Node.js 文件系统模块

    章节 Node.js 介绍 Node.js 入门 Node.js 模块 Node.js HTTP模块 Node.js 文件系统模块 Node.js URL模块 Node.js NPM Node.js ...

  5. SpringBoot Application事件监听

    SpringBoot Application共支持6种事件监听,按顺序分别是: ApplicationStartingEvent:在Spring最开始启动的时候触发 ApplicationEnviro ...

  6. Eclipse反编译插件jad的安装

    Eclipse反编译插件jad的安装 JadClipse是Jad的Eclipse插件,是一款非常实用而且方便的Java反编译插件.时间久了,可能忘记在哪里进行配置了,因此记录下以备后续使用(若需要). ...

  7. cf 621E. Wet Shark and Blocks

    神奇,矩阵乘法23333333333333333 递推式是很简单的(连我这种不会DP的人都写出来了.) 需要求出的是转移矩阵(还是叫系数矩阵的),也是最这个东西用快速幂. 这个东西的i,j大概就表示从 ...

  8. cron 表达式0 0/10 * * * 与 0 */10 * * *的区别

    0 0/10 * * * 与 0 */10 * * * 的差别在于什么地方.在说这两者的差别之前,先说下各个字符代表的含义.0代表从0分开始,*代表任意字符,/代表递增. 0 0/10 * * *代表 ...

  9. Element.scrollIntoView() 和 document.elementFromPoint ()

    Element​.scroll​Into​View() 让当前的元素滚动到浏览器窗口的可视区域内 element.scrollIntoView(); // 等同于element.scrollIntoV ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 注释

    程序的注释是解释性语句,可以在 C++ 代码中包含注释,这将提高源代码的可读性.所有的编程语言都允许某种形式的注释. C++ 支持单行注释和多行注释.注释中的所有字符会被 C++ 编译器忽略. C++ ...