如何将QImage转换为opencv Mat

use*_*633 6 c++ qt opencv

我在互联网上搜索过但我找不到将QImage(或QPixmap)转换为OpenCV的方法Mat.我该怎么做?

任何帮助表示赞赏.

tim*_*irg 10

发表这个问题一年后,互联网上有很好的答案:

但是我看到它的方式,如果你同时使用Qt和OpenCV,那么类型QImage可能只是用于显示,这种情况你可能想要使用,QPixmap因为它已经针对显示进行了优化.所以这就是我做的:

  1. 加载图像cv::Mat,如果您想显示图像,请转换为QPixmap使用第二篇文章中介绍的非复制方法.
  2. 你的图像处理cv::Mat.
  3. 在工作流程中的任何时候,您都可以调用类似于Mat2QPixmap()获得实时结果的内容.
  4. 从不转换QPixmapcv::Mat,考虑到每种类型的目的,没有任何意义.


Mar*_*ett 9

如果QImage仍然存在并且您只需要对其执行快速操作,那么您可以使用QImage内存构造cv :: Mat

cv::Mat mat(image.rows(),image.cols(),CV_8UC3,image.scanline()); 这假设Qimage是3通道,即RGB888

如果Qimage消失,那么你需要复制数据,看看Qimage到cv :: Mat转换奇怪的行为

如果QImage是Format_ARGB32_Premultiplied(优先格式),那么您需要将每个像素转换为openCV的BGR布局.cv :: cvtcolor()函数可以在最新版本中将ARGB转换为RGB.
或者,您可以在复制数据之前使用QImage :: convertToformat()转换为RGB

  • 另外,我找不到scanLine()根本没有args重载. (2认同)
  • 您建议的方式抛出一个编译错误,指出:*'rows':不是'QImage'*的成员,并且对于'cols'和'scanline'也是相同的。 (2认同)

dev*_*nut 6

Qt 5.11(可能还有一些早期版本)对此的回答:

    cv::Mat mat(image.height(), image.width(),CV_8UC3, image.bits());  
    // image.scanline() does not exist, 
    //and height/width is interchanged for a matrix
Run Code Online (Sandbox Code Playgroud)

再次假设 QImage 为 RGB888(即 QImage::Format_RGB888)