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

  • 相关阅读:
    html学习总结
    16--二叉树的镜像
    17-- 从上到下打印二叉树,按层打印。
    14--反转链表
    14--合并两个排序的链表
    15-- 输入两个二叉树A和B,判断B树是否包含于A树。
    13--输入一个整数数组,实现一个函数来调整数组中数字的顺序
    13--输出链表中倒数第k个节点,
    12--打印1到最大的N为数字。
    10--输入一个十进制的整数,转化为二进制,输出有多少个1
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3040072.html
Copyright © 2011-2022 走看看