zoukankan      html  css  js  c++  java
  • 更快地从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越走越近!
    
  • 相关阅读:
    从boosting谈起
    《人月神话》读书摘记
    Python中input()的使用方法
    Web前端攻击方式及防御措施
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
    Mybatis的Mapper文件sql语句中使用常量值或者枚举常量值
    Java依据文件头获取文件类型
    MySQL查询优化
    RabbitMQ学习教程
    SpringBoot2.x.x + Shiro + Redis 前后端分离实现
  • 原文地址:https://www.cnblogs.com/jwchen08/p/5942546.html
Copyright © 2011-2022 走看看