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

  • 相关阅读:
    关于JavaWeb项目汉字乱码问题
    使用pipenv
    python使用imap-tools模块下载邮件中的附件
    Python新增功能, 函数的参数类型提示.
    centos83+django3.1+ASGI+nginx部署.
    python3.9 pip本身的升级
    windows+django3.1+ASGI+nginx部署
    k8s 单节点开发环境用hostPath配置mysql的持久化存储
    Rust的设计中为什么要区分不可变变量和常量?
    Vscode + Python + Django开发环境常见问题
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3040072.html
Copyright © 2011-2022 走看看