更快地从IplImage转换成QImage

    在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越走越近!
原文地址:https://www.cnblogs.com/jwchen08/p/5942546.html