【转】Mat、Ipllmage与 QImage 的相互转换

(1) cv::Mat ->  QImage

OpenCV存储图片默认使用BGR顺序,而QImage使用RGB顺序,所以需要用cvtColor转换一下。

使用QImage如下构造函数:QImage(uchar * data, int width, int height, Format format)

QImage mat2qimage(const Mat& mat) {
      Mat rgb;
      cvtColor(mat, rgb, CV_BGR2RGB); 
      return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888); 
};

(2) QImage -> cv::Mat

QImage使用 RGBa(?) 四个通道保存图像数据,转换成的Mat应该删掉第四个通道。

Mat qimage2mat(const QImage& qimage) {
      cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.bytesPerLine()); 
      cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 ); 
      int from_to[] = { 0,0, 1,1, 2,2 };
      cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 );
      return mat2;
}

3、QImage 转 IplImage(imageRGB32 --> originalImage):

QImage imageRGB32(fileName);
QImage image = imageRGB32.convertToFormat(QImage::Format_RGB888);
IplImage *Oimage = cvCreateImageHeader(cvSize(image.width(), image.height()), IPL_DEPTH_8U, 3);
Oimage->imageData = (char *)image.bits();
IplImage *originalImage = cvCreateImage(cvSize(image.width(), image.height()), IPL_DEPTH_8U, 3);
cvConvertImage(Oimage, originalImage, CV_CVTIMG_SWAP_RB);
cvReleaseImageHeader(&Oimage);

4、IplImage 转 QImage(BGRimage --> Qimage):

IplImage *BGRimage = cvLoadImage(filename, CV_LOAD_IMAGE_COLOR);
IplImage *RGBimage = cvCreateImage(cvSize(BGRimage->width, BGRimage->height), IPL_DEPTH_8U, 3);
cvConvertImage(BGRimage, RGBimage, CV_CVTIMG_SWAP_RB);
QImage
Qimage((uchar *)RGBimage->imageData, RGBimage->width,
RGBimage->height, RGBimage->widthStep, QImage::Format_RGB888);
cvReleaseImage(&BGRimage);
cvReleaseImage(&RGBimage);

【转】Mat、Ipllmage与 QImage 的相互转换

时间: 2024-10-09 20:09:21

【转】Mat、Ipllmage与 QImage 的相互转换的相关文章

OpenCV学习(2)--cv::Mat转化为QImage

一.目的 在使用Qt和OpenCV写程序的时候,有时候需要使用OpenCV进行处理,然后使用Qt显示出来,因此,有必要考虑将如何将cv::Mat类型转换为QImage类型. 二.原理 网上主流的做法是使用QImage的构造函数进行转换,主要是使用cv::Mat的data来构造一个QImage类型,这样做确实可以达到转换目的,但是,因此这样构造出来的QImage本身并不保存data,因此,在QImage的生存周期内,必须保证cv::Mat中的数据不会被释放.上面的这个问题也是比较容易解决的,主要是

QImage 与 cv::Mat 之间的相互转换

最近做图像处理方面的项目比较多,很多算法自己从头写的话太浪费时间,而且自己写的也不一定完善,早就听说OpenCV在图像处理算法方面功能很强大,一直没时间学习,这次正好项目用到了,临时抱佛脚学习些OpenCV入门知识.因为我的程序界面都是用Qt写的,因此也花了点时间研究了如何将OpenCV 和Qt 融合在一起,协同工作. Qt 中处理图像主要用的是QImage类,OpenCV中主要用的是cv::Mat类.下面的两个函数可以用来实现这两个类相互转换. QImage cvMat2QImage(cons

OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)

在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ##### // Shallow copy QImage mat2qimage_ref(cv::Mat &m, QImage::Format format) { return QImage(m.data, m.cols, m.rows, m.step, format); } // Deep copy QI

【转】OpenCV与CxImage转换(IplImage)、IplImage QImage Mat 格式互转

最近由于在项目中用到了Opencv库,但是为了更好的显示图像还是使用了Cximage库,它可以快捷地存取.显示.转换各种图像.Opencv库用于高级图像处理与识别.为了使Cximage图像与Opencv图像交互,写了个Cximage转换到IplImage的类. OpenCV2CXimage.h #pragma once /* * 类说明:OpenCV图像与CXimage图像互转 * 用于OpenCV的图像与CXimage图像格式互转进行封装. OpenCV的图像位数必须是大等于8的整数倍,支持B

QT 12 QTimage转换Mat

QImage cvMat2QImage(const cv::Mat& mat) { // 8-bits unsigned, NO. OF CHANNELS = 1 if(mat.type() == CV_8UC1) { QImage image(mat.cols, mat.rows, QImage::Format_Indexed8); // Set the color table (used to translate colour indexes to qRgb values) image.se

[Qt5] Develop openCV3 by QML on Qt-creator

QML的酷炫控件,适合移动设备开发. qt-creator的跨平台是QML与opencv的粘合剂. 关键: QImage有若干种格式,转化为相应的Mat. Mat处理完后,还要正确得还原为原来格式的QImage. 关键在于:QImage2cvMat(image);cvmat2qimage(mat);的定义. 图像格式的转化: static void _gray(QString sourceFile, QString destFile){ QImage image(sourceFile); if(

使用Qt创建第一个OpenCV的Gui应用

写在前面 学习OpenCV有一些小日子了,发现群里还有很多初学OpenCV的人像我当初一样跌跌撞撞到处找资料,所以在这里把学习笔记分享给大家,希望有志学习OpenCV进行计算机视觉活动的小伙伴们能少走一些弯路. 经过多方面查阅资料,了解到Qt开发平台对OpenCV的支持很好,但是在网上这方面的资料很少,能查到的大部分的图形交互设计都是基于OpenCV2.0之前的数据结构IplImage,而OpenCV现在官方已经更新到2.4.9版本了.偶然发现一本好书最近得到了一本好书< OpenCV 2 Co

QT+QT creator+OpenCV图像灰度化

1).pro文件 #------------------------------------------------- # # Project created by QtCreator 2014-05-18T12:56:52 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = myQTDemo TEM

基于opencv和QT的瞳孔精确检测程序

本文为作者为毕业设计所写的瞳孔精确检测程序,谢绝任何形式的转载. 本篇博客是在作者的前两篇博客 <基于QT和opencv的摄像头(本地图片)读取并输出程序>和< 基于opencv和QT的人脸(人眼)检测程序>的基础上进行开发的.主要原理是:针对已经检测到的人眼区域图像,利用边缘检测和Hough变换实现瞳孔的精确检测. 首先建立一个图像处理类,对每一帧图像进行处理. class ImgProcess { private: Mat inimg;//输入图像 Mat outimg;//输