zoukankan      html  css  js  c++  java
  • Using OpenCV with Qt

    The IplImage and Qt

    In order to take advantage of the 500 algorithms offered by OpenCV, Qt applications have to manage iplImages. Therefore, converting QImageto/from iplImage is very important.

    Converting QImage to iplImage

    This snippet will convert QImages into iplImage with depth 8 and 3 channels. QImage can store data in several formats. This code accepts just 24-bit QImage::Format_RGB888 and theQImage::Format_RGB32. Apha values in the 32-bit format will be removed during the conversion.

    static IplImage* qImage2IplImage(const QImage& qImage)
      {
        int width = qImage.width();
        int height = qImage.height();
     
        // Creates a iplImage with 3 channels
        IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
        char * imgBuffer = img->imageData;
     
        //Remove alpha channel
        int jump = (qImage.hasAlphaChannel()) ? 4 : 3;
     
        for (int y=0;y<img->height;y++){
          QByteArray a((const char*)qImage.scanLine(y), qImage.bytesPerLine());
          for (int i=0; i<a.size(); i+=jump){
              //Swap from RGB to BGR
              imgBuffer[2] = a[i];
              imgBuffer[1] = a[i+1];
              imgBuffer[0] = a[i+2];
              imgBuffer+=3;
          }
      }
     
      return img;
      }

    Converting iplImage to QImage

    This snippet will convert a iplImage with depth 8 and 1 or 3 channels into a 8/24-bit QImage.

    Note.png
    Note: This code won't work for images with different depth and number of channels.
    static QImage IplImage2QImage(const IplImage *iplImage)
    {
        int height = iplImage->height;
        int width = iplImage->width;
     
        if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
        {
          const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
          QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
          return img.rgbSwapped();
        } else if  (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1){
    	const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
    	QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);
     
    	QVector<QRgb> colorTable;
    	for (int i = 0; i < 256; i++){
    	    colorTable.push_back(qRgb(i, i, i));
    	}
    	img.setColorTable(colorTable);
    	return img;
        }else{
          qWarning() << "Image cannot be converted.";
          return QImage();
        }
    }

    http://www.developer.nokia.com/Community/Wiki/Using_OpenCV_with_Qt

  • 相关阅读:
    C库函数笔记
    曼彻斯特及差分曼彻斯特编码
    VS2008 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
    刚子扯谈:酒装狗熊胆
    poj1410
    新游戏《真·方块无双》发布-穿越混世过险境,运筹方块化无双
    hdu4267 A Simple Problem with Integers
    【转载】变量的存储类型
    【转载】硬盘存储原理和内部结构
    【转载】让windows使用linux系统的命令
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3040072.html
Copyright © 2011-2022 走看看