zoukankan      html  css  js  c++  java
  • 【转】Mat、Ipllmage与 QImage 的相互转换

    (1) cv::Mat ->  QImage

    OpenCV存储图片默认使用BGR顺序,而QImage使用RGB顺序,所以需要用cvtColor转换一下。

    使用QImage如下构造函数:QImage(uchar * data, int width, int height, Format format)

    QImage mat2qimage(const Mat& mat) {
          Mat rgb;
          cvtColor(mat, rgb, CV_BGR2RGB); 
          return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888); 
    };

    (2) QImage -> cv::Mat

    QImage使用 RGBa(?) 四个通道保存图像数据,转换成的Mat应该删掉第四个通道。

    Mat qimage2mat(const QImage& qimage) {
          cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.bytesPerLine()); 
          cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 ); 
          int from_to[] = { 0,0, 1,1, 2,2 };
          cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 );
          return mat2;
    }

    3、QImage 转 IplImage(imageRGB32 --> originalImage):

    QImage imageRGB32(fileName);
    QImage image = imageRGB32.convertToFormat(QImage::Format_RGB888);
    IplImage *Oimage = cvCreateImageHeader(cvSize(image.width(), image.height()), IPL_DEPTH_8U, 3);
    Oimage->imageData = (char *)image.bits();
    IplImage *originalImage = cvCreateImage(cvSize(image.width(), image.height()), IPL_DEPTH_8U, 3);
    cvConvertImage(Oimage, originalImage, CV_CVTIMG_SWAP_RB);
    cvReleaseImageHeader(&Oimage);


    4、IplImage 转 QImage(BGRimage --> Qimage):

    IplImage *BGRimage = cvLoadImage(filename, CV_LOAD_IMAGE_COLOR);
    IplImage *RGBimage = cvCreateImage(cvSize(BGRimage->width, BGRimage->height), IPL_DEPTH_8U, 3);
    cvConvertImage(BGRimage, RGBimage, CV_CVTIMG_SWAP_RB);
    QImage Qimage((uchar *)RGBimage->imageData, RGBimage->width, RGBimage->height, RGBimage->widthStep, QImage::Format_RGB888);
    cvReleaseImage(&BGRimage);
    cvReleaseImage(&RGBimage);

  • 相关阅读:
    Jquery ajax异步传值的两个实用的方法,你看后肯定会用第二个
    C# ASP.NET 转换为int型的方法 很实用
    NetCore 发送邮件
    解决Visual Studio For Mac Restore失败的问题
    (转)JSONObject的toBean 和 fromObject
    javax.servlet不存在的问题
    关于范式的解说
    在远程连接mysql数据库出现问题怎么办
    (二)SpringCloud学习系列-SpringCloud
    (一)SpringCloud学习系列-微服务
  • 原文地址:https://www.cnblogs.com/zsclucien/p/3790515.html
Copyright © 2011-2022 走看看