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

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

IplImage 转换为 QImage

方法1

  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。

例如:

  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

  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

  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

  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格式的图像。

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

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

    在用opencv处理图片显示在qt label上的时候遇到不是问题 1. qt上要用qimage形式才干显示 IplImage转成 Qimage 彩色图像转换 IplImage  *fram; QIm ...

  2. 关于QImage和IplImage之间转换的实现

    在嵌入式系统中实现qt和opencv的处理,最基础的就是QImage和IplImage之间的转换.这样两者就可以进行一起使用图像数据,从而达到利用qt显示和利用opencv处理的功能. 下面我将贴出代 ...

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

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

  4. 更快地从IplImage转换成QImage

    转:http://blog.sina.com.cn/s/blog_5c70dfc80100qzif.html 在Qt平台上使用OpenCV肯定会遇到从IplImage到QImage的转换问题,找了很多 ...

  5. Qimage与IplImage的转换

    QImage test2012::ImageCV2Qimg(IplImage* img){ assert(img!=NULL); int h = img->height; int w = img ...

  6. javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)

    前言:本篇文章依赖四个jar包,其中javacv.jar,javacpp.jar和opencv.jar为固定jar包,opencv-系统环境.jar为选配(根据自己的系统平台,x64还是x86而定) ...

  7. Qt 编程指南10 QImage Mat QPixmap转换

      //示例 pushButtonOpenPicBig按钮clicked单击动作触发 void Qt_Window::on_pushButtonOpenPicBig_clicked() { strin ...

  8. 【OpenCV开发】OpenCV3后IPLimage转换成MAT的问题

    IplImage* img1 = cvCreateImage(cvGetSize(resizeRes), IPL_DEPTH_8U, 1);//创建目标图像 Mat test = img1;  报错 ...

  9. opencv3.0之后IPLimage转换成MAT的问题

    转自http://www.cnblogs.com/edver/p/5187190.html IplImage * ipl = ...; cv::Mat m = cv::cvarrToMat(ipl); ...

随机推荐

  1. TChart-图表编辑器的测试

    最近不知怎么的,想研究一下图表.先上效果图: 功能代码: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Class ...

  2. “石家庄铁道大学软件工程系学生学籍管理系统2019版”java小程序制作分享

    首先附上完整代码: import java.util.Scanner; public class SocreInformation { public SocreInformation(){}; pub ...

  3. Django---Django返回用户输入数据

    前面写了关于HTML和Django结合的文章,通过视图与HTML结合,然后加上urls渲染返回给用户浏览器.很明显我们都能看到这些仅仅是静态HTML,那如何通过Django创建动态的HTML呢? 动态 ...

  4. Java中的isEmpty方法、null以及""的区别

    本文转自:https://blog.csdn.net/peng86788/article/details/80885814 这是一个比较容易混淆的概念,为了弄清楚这个问题,最好的方法当然是写程序来验证 ...

  5. ASP.NET MVC5----数据注解和验证

    在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部分.验证首先需要管理用户友 ...

  6. vue项目中使用element ui上传图片到七牛

    1.获取token值 后台有接口调用直接返回token值 //请求后台拿七牛云token async getQiniuToken() { //token let uploadtoken = await ...

  7. 【Vue2.x笔记3】从源码看watch对象

    初始化 function initWatch (vm: Component, watch: Object) { for (const key in watch) { const handler = w ...

  8. 题解 P5712 【【深基3.例4】Apples】

    题目传送门 思路 仔细读题后,我们可以发现,输出可以分成\(2\)种情况,apple加s与apple不加s,所以我们可以使用if/else来实现. 接着,我们读入n. int n; cin>&g ...

  9. 16G内存,将内存占用,降到了 40% 以下,之前是 90%+

    自定义组件:

  10. Docker最全教程——从理论到实战(十七)

    前言 上一篇我们通过实战分享了使用Go推送钉钉消息,由于技痒,笔者现在也编写了一个.NET Core的Demo,作为简单的对照和说明. 最后,由于精力有限,笔者希望有兴趣的朋友可以分享下使用CoreR ...