QImage和IplImage转换总结
在arm中做图像处理,因为不支持GTK,一般都会用到QT来实现显示功能,所以不可避免的要涉及到QImage和IplImage两种图像格式之间的转换,下面总结一下转换的方法。
(下面格式转换的代码都是网友写的,我这里只是归纳修改了一下)
IplImage 转换为 QImage
方法1
- QImage *IplImageToQImage(const IplImage *img)
- {
- QImage *qmg;
- cvCvtColor(img,img,CV_BGR2RGB);
- qmg = new QImage((unsigned char*)img->imageData,img->width,img->height,img->widthStep,QImage::Format_RGB888);
- return qmg;
- }
这里要注意的是,IplImage每个像素点存储的格式为BGR,而QImage每个像素点存储的格式为RGB,所以在转换之前需要先使用opencv提供的cvCvtColor函数将BGR图像变为RGB图像。还有就是QImage最后一个参数QImage::Format_RGB888,这是指色彩空间R,G,B三个通道分别用8位来表示,如果是灰度图,则参数为QImage::Format_Indexed8。
例如:
- QImage *IplImageToQImage(const IplImage *img)
- {
- QImage *qmg;
- IplImage *img_gray = cvCreateImage(cvGetSize(img),8,1);
- cvCvtColor(img,img_gray,CV_BGR2GRAY);
- qmg = new QImage((unsigned char*)img->imageData,img->width,img->height,img->widthStep,QImage::Format_Indexed8);
- return qmg;
- }
方法2
- QImage *IplImageToQImage(*img)
- {
- QImage *qmg = new QImage (img->width,img-height,img->widthStep,QImage::Format_RGB32);
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width; ++j)
- {
- int r,g,b;
- if( 3 == img->nChannels )
- {
- b = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+0 );
- g = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+1 );
- r = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+2 );
- }
- else if( 1 == img->nChannels )
- {
- b = (int)CV_IMAGE_ELEM( img, uchar, i, j*3+0 );
- g = b;
- r = b;
- }
- qmg->setPixel( j, i, qRgb(r,g,b) );
- }
- }
- return qmg;
- }
这里要注意的是qmg->setPixel( j, i, qRgb(r,g,b) );括号里面是(j,i);而不是(i,j)。我还没弄明白为什么这里要调换一下i,j的顺序,希望知道的朋友指点一下。
QImage转换为IplImage
方法1
- IplImage *QImageToIplImage(const QImage * qImage)
- {
- int width = qImage->width();
- int height = qImage->height();
- CvSize Size;
- Size.height = height;
- Size.width = width;
- IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 3);
- for (int y = 0; y < height; ++y)
- {
- for (int x = 0; x < width; ++x)
- {
- QRgb rgb = qImage->pixel(x, y);
- cvSet2D(IplImageBuffer, y, x, CV_RGB(qRed(rgb), qGreen(rgb), qBlue(rgb)));
- }
- }
- return IplImageBuffer;
- }
方法2
- IplImage *QImageToIplImage(const QImage * qImage)
- {
- int width = qImage->width();
- int height = qImage->height();
- CvSize Size;
- Size.height = height;
- Size.width = width;
- IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 3);
- for (int y = 0; y < height; ++y)
- {
- for (int x = 0; x < width; ++x)
- {
- QRgb rgb = qImage->pixel(x, y);
- CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+0 ) = qBlue(rgb);
- CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+1 ) = qGreen(rgb);
- CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+2 ) = qRed(rgb);
- }
- }
- return IplImageBuffer;
- }
这两种方法其实都是一样的,只是表达形式有点不同,还有就是一个是生成RGB格式图像,一个是生成BGR格式的图像。
QImage和IplImage转换总结的更多相关文章
- qt中使用opencv处理图片 QImage 和 IplImage 相互之间转换问题
在用opencv处理图片显示在qt label上的时候遇到不是问题 1. qt上要用qimage形式才干显示 IplImage转成 Qimage 彩色图像转换 IplImage *fram; QIm ...
- 关于QImage和IplImage之间转换的实现
在嵌入式系统中实现qt和opencv的处理,最基础的就是QImage和IplImage之间的转换.这样两者就可以进行一起使用图像数据,从而达到利用qt显示和利用opencv处理的功能. 下面我将贴出代 ...
- OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)
在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...
- 更快地从IplImage转换成QImage
转:http://blog.sina.com.cn/s/blog_5c70dfc80100qzif.html 在Qt平台上使用OpenCV肯定会遇到从IplImage到QImage的转换问题,找了很多 ...
- Qimage与IplImage的转换
QImage test2012::ImageCV2Qimg(IplImage* img){ assert(img!=NULL); int h = img->height; int w = img ...
- javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)
前言:本篇文章依赖四个jar包,其中javacv.jar,javacpp.jar和opencv.jar为固定jar包,opencv-系统环境.jar为选配(根据自己的系统平台,x64还是x86而定) ...
- Qt 编程指南10 QImage Mat QPixmap转换
//示例 pushButtonOpenPicBig按钮clicked单击动作触发 void Qt_Window::on_pushButtonOpenPicBig_clicked() { strin ...
- 【OpenCV开发】OpenCV3后IPLimage转换成MAT的问题
IplImage* img1 = cvCreateImage(cvGetSize(resizeRes), IPL_DEPTH_8U, 1);//创建目标图像 Mat test = img1; 报错 ...
- opencv3.0之后IPLimage转换成MAT的问题
转自http://www.cnblogs.com/edver/p/5187190.html IplImage * ipl = ...; cv::Mat m = cv::cvarrToMat(ipl); ...
随机推荐
- Math, Date,JSON对象
Math 对象 Math是 JavaScript 的原生对象,提供各种数学功能.该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用. 静态属性 Math对象的静态属性,提供以 ...
- c#枚举转字典或表格
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 2020牛客寒假算法基础集训营4-I 匹配星星【贪心】
链接:https://ac.nowcoder.com/acm/contest/3005/I来源:牛客网 示例1 输入 复制 2 1 1 0 2 2 1 2 1 1 0 2 2 1 输出 复制 1 1 ...
- npx是什么
npx是一个执行npm软件包的二进制文件,通俗的讲,他可以执行npm的一些指令 在npm>5.2.0 的时候npm里面就集成了npx 比如npx webpack 他会执行node_modules ...
- 数据预处理 | 使用 Pandas 进行数值型数据的 标准化 归一化 离散化 二值化
1 标准化 & 归一化 导包和数据 import numpy as np from sklearn import preprocessing data = np.loadtxt('data.t ...
- jacob导入项目
在 resource 下创建一个 lib 将网上下载的 jacob.jar 放入其中 在 pom 文件中导入相对应的 jar 包 <dependency> <groupId>c ...
- 【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现
console.log( a ); var a = 2; 执行输出undefined a = 2; var a; console.log( a ); 执行输出2 说明:javaScript 运行时在编 ...
- 将自定义工程加入到python根目录下
1. 在D:\Program Files\Python\Lib\site-packages 添加.pth文件,文件名为模块名称(即auto_XXX),文件内容为模块所在目录.(python添加自定义的 ...
- Vim入门——Windows下安装
下载页面:https://www.vim.org/download.php Windows选用的是MS-Windows: 下图为展示: 因为最近被墙,镜像貌似没中国内陆地区,因此,选择使用GitHub ...
- Selenium3+python自动化007-Selenium常用定位方法
自动化测试只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.元素定位在这四个环节中是至关重要的,如果说按学习精力分配的话,元素定位占70%:操 ...