加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转]Qt中QImage与OpenCV中Mat相互转换

(2013-12-20 13:13:20)
分类: Qt
1.Mat to QImage
QImage mat2qimage(const cv::Mat& mat)
{
cv::Mat rgb;
cv::cvtColor(mat, rgb, CV_BGR2RGB);

    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888); 
}

2.QImage to Mat
cv::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               Mat
数据指针  uchar* bits()       uchar* data
宽度        int width()          int cols
高度        int height()         int rows
步长      int bytesPerLine()   cols * elemeSize()
格式      Format_Indexed8      8UC1, GRAY,灰度图
            Format_RGB888        8UC3, BGR, 需要通过mixChannels进行顺序调换
            Format_ARGB32        8UC4, BGRA,需要通过mixChannels进行顺序调换
         以此类推,只要保证通道数以及排列顺序一致即可。
在转换的过程中一定要先判断图像的格式,QImage用QImage::format(), Mat中用Mat::channels(),然后再设置相应的转换参数

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有