更快地从IplImage转换成QImage

转:http://blog.sina.com.cn/s/blog_5c70dfc80100qzif.html

在Qt平台上使用OpenCV肯定会遇到从IplImage到QImage的转换问题,找了很多资料,忽略那些太差或者太费时的算法,这样的一个算法还是很不错的。

 
QImage* CjwCvImageToQImage(const IplImage* cvimage)
{
if (!cvimage)
return 0;
QImage *qimage =new QImage(cvimage->width, cvimage->height, QImage::Format_RGB32);

int cvIndex = 0;
int cvLineStart = 0;
for (int y = 0; y < cvimage->height; y++)
{
unsigned char red,green,blue;
cvIndex = cvLineStart;
for (int x = 0; x < cvimage->width; x++)
{
red = cvimage->imageData[cvIndex+2];
green = cvimage->imageData[cvIndex+1];
blue = cvimage->imageData[cvIndex+0];
qimage->setPixel(x,y,qRgb(red, green, blue));
cvIndex += 3;
}
cvLineStart += cvimage->widthStep;
}
return qimage;
}
 
转换一幅360*640的图片大约需要25ms。

后来发现IplImage结构中有imageData这样的一个uchar*类型变量,而QImage可以利用data构造对象,所以就有了下面的更有效的算法:

QImage* CjwIplToQImg(const IplImage *cvImg)
{

if(!cvImg)

return NULL;

IplImage* temp=NULL;

temp=cvCloneImage(cvImg);

cvCvtColor(cvImg,temp,CV_BGR2RGB);



uchar* imgData = (uchar*)(temp->imageData);

QImage *qImg=new QImage(imgData,temp->width,temp->height,QImage::Format_RGB888);

return qImg;

cvReleaseImage(&temp);

delete imgData;

}
 
转换同样的一幅图片只需要15ms,可以发现不仅代码量大大减少,而且速度也大幅提升了。
 
    最近一直在搞Qt平台上的OpenCV应用,希望Qt和OpenCV越走越近!
posted @ 2013-12-23 17:00  蓝夜  阅读(343)  评论(0编辑  收藏  举报