QImage和IplImage转换总结

在arm中做图像处理,因为不支持GTK,一般都会用到QT来实现显示功能,所以不可避免的要涉及到QImage和IplImage两种图像格式之间的转换,下面总结一下转换的方法。

(下面格式转换的代码都是网友写的,我这里只是归纳修改了一下)

IplImage 转换为 QImage

方法1

[plain] view plain copy

  1. QImage *IplImageToQImage(const IplImage *img)
  2. {
  3. QImage *qmg;
  4. cvCvtColor(img,img,CV_BGR2RGB);
  5. qmg = new QImage((unsigned char*)img->imageData,img->width,img->height,img->widthStep,QImage::Format_RGB888);
  6. return qmg;
  7. }

这里要注意的是,IplImage每个像素点存储的格式为BGR,而QImage每个像素点存储的格式为RGB,所以在转换之前需要先使用opencv提供的cvCvtColor函数将BGR图像变为RGB图像。还有就是QImage最后一个参数QImage::Format_RGB888,这是指色彩空间R,G,B三个通道分别用8位来表示,如果是灰度图,则参数为QImage::Format_Indexed8。

例如:

[plain] view plain copy

  1. QImage *IplImageToQImage(const IplImage *img)
  2. {
  3. QImage *qmg;
  4. IplImage *img_gray = cvCreateImage(cvGetSize(img),8,1);
  5. cvCvtColor(img,img_gray,CV_BGR2GRAY);
  6. qmg = new QImage((unsigned char*)img->imageData,img->width,img->height,img->widthStep,QImage::Format_Indexed8);
  7. return qmg;
  8. }

方法2

[plain] view plain copy

  1. QImage *IplImageToQImage(*img)
  2. {
  3. QImage *qmg = new QImage (img->width,img-height,img->widthStep,QImage::Format_RGB32);
  4. for (int i=0; i<height; ++i)
  5. {
  6. for (int j=0; j<width; ++j)
  7. {
  8. int r,g,b;
  9. if( 3 == img->nChannels )
  10. {
  11. b = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+0 );
  12. g = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+1 );
  13. r = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+2 );
  14. }
  15. else if( 1 == img->nChannels )
  16. {
  17. b = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+0 );
  18. g = b;
  19. r = b;
  20. }
  21. qmg->setPixel( j, i, qRgb(r,g,b) );
  22. }
  23. }
  24. return qmg;
  25. }


这里要注意的是qmg->setPixel( j, i, qRgb(r,g,b) );括号里面是(j,i);而不是(i,j)。我还没弄明白为什么这里要调换一下i,j的顺序,希望知道的朋友指点一下。

QImage转换为IplImage

方法1

[plain] view plain copy

  1. IplImage *QImageToIplImage(const QImage * qImage)
  2. {
  3. int width = qImage->width();
  4. int height = qImage->height();
  5. CvSize Size;
  6. Size.height = height;
  7. Size.width = width;
  8. IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 3);
  9. for (int y = 0; y < height; ++y)
  10. {
  11. for (int x = 0; x < width; ++x)
  12. {
  13. QRgb rgb = qImage->pixel(x, y);
  14. cvSet2D(IplImageBuffer, y, x, CV_RGB(qRed(rgb), qGreen(rgb), qBlue(rgb)));
  15. }
  16. }
  17. return IplImageBuffer;
  18. }


方法2

[plain] view plain copy

  1. IplImage *QImageToIplImage(const QImage * qImage)
  2. {
  3. int width = qImage->width();
  4. int height = qImage->height();
  5. CvSize Size;
  6. Size.height = height;
  7. Size.width = width;
  8. IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 3);
  9. for (int y = 0; y < height; ++y)
  10. {
  11. for (int x = 0; x < width; ++x)
  12. {
  13. QRgb rgb = qImage->pixel(x, y);
  14. CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+0 ) = qBlue(rgb);
  15. CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+1 ) = qGreen(rgb);
  16. CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+2 ) = qRed(rgb);
  17. }
  18. }
  19. return IplImageBuffer;
  20. }


这两种方法其实都是一样的,只是表达形式有点不同,还有就是一个是生成RGB格式图像,一个是生成BGR格式的图像。

原文地址:https://www.cnblogs.com/yzl050819/p/8410581.html

时间: 2024-10-11 15:34:44

QImage和IplImage转换总结的相关文章

qt中使用opencv处理图片 QImage 和 IplImage 相互之间转换问题

在用opencv处理图片显示在qt label上的时候遇到不是问题 1. qt上要用qimage形式才能显示 IplImage转成 Qimage 彩色图像转换 IplImage  *fram; QImage image((const uchar*)fram->imageData, fram->width, fram->height, QImage::Format_RGB888); 在用opencv二值化以后你再转换发现出现label里面显示多个画面而且还有彩色的怎么回事 这时候得换参数

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

Qt 编程指南10 QImage Mat QPixmap转换

  //示例 pushButtonOpenPicBig按钮clicked单击动作触发 void Qt_Window::on_pushButtonOpenPicBig_clicked() { string filename =GetFileName() ; // 获取图像路径 Mat picMat= imread(filename, 1); // 读取保存为opencv Mat类图像 QPixmap picQPixmap = MatToQT(picMat); //opencv Mat类图像转换QT

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

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

IplImage 与 QImage 相互转换

在使用Qt和OpenCV编程时,对于它们各自的图像类QImage和IplImage难以避免的需要互相之间的转换,下面我们就来看它们的相互转换. 1. QImage 转换为 IplImage IplImage *QImageToIplImage(const QImage * qImage) { int width = qImage->width(); int height = qImage->height(); CvSize Size; Size.height = height; Size.wi

Convert between cv::Mat and 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

【转】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);       retu

移植opencv到开发板,摄像头在开发板6410上的采集使用(2)

在虚拟机搭建好系统后,真正的使用才刚刚开始. 在使用摄像头的时候,首先看自己的摄像头插上去是显示jpeg的还是yuv的 yuv的要实现UVC转QImage转IplImage这样的流程才能使用,jpeg的好多人不会用说没用其实最好用了.一点不卡.yuv的有点卡. 我用的也是yuv以前朋友用的jpeg的摄像头. 代码是用的网上的一个代码修改的 1. [文件] videodevice.h ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2

[iOS OpenCV的使用,灰度和二值化]

看网上方法很多,但版本都不够新,我看了网上一些知识,总结了下,来个最新版Xcode6.1的. 最近主要想做iOS端的车牌识别,所以开始了解OpenCV.有兴趣的可以跟我交流下哈. 一.Opencv的使用: 步骤: 1.从官网下载iOS版本的Opencv2.framework. 2.拖进工程,选择copy items if needed 3.进入building settings,设置Framework SearchPath: 设置成$(PROJECT_DIR)/Newtest,这个Newtest