【转】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);

转载于:https://www.cnblogs.com/zsclucien/p/3790515.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值