转: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越走越近!