tim*_*irg 10
发表这个问题一年后,互联网上有很好的答案:
但是我看到它的方式,如果你同时使用Qt和OpenCV,那么类型QImage可能只是用于显示,这种情况你可能想要使用,QPixmap因为它已经针对显示进行了优化.所以这就是我做的:
cv::Mat,如果您想显示图像,请转换为QPixmap使用第二篇文章中介绍的非复制方法.cv::Mat.Mat2QPixmap()获得实时结果的内容.QPixmap为cv::Mat,考虑到每种类型的目的,没有任何意义.如果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
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)