首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将QImage转换为opencv Mat

如何将QImage转换为opencv Mat
EN

Stack Overflow用户
提问于 2012-08-09 22:51:56
回答 5查看 25.5K关注 0票数 8

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

任何帮助都是非常感谢的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-09 23:37:50

如果QImage仍然存在,您只需对其执行一个快速操作,则可以使用QImage内存构建一个cv::Mat::Mat:

cv::Mat mat(image.height(), image.width(), CV_8UC3, (cv::Scalar*)image.scanLine(0));

这假设QImage是3-通道,即RGB888。

如果QImage正在消失,那么您需要复制数据,请参见Qimage to cv::Mat convertion strange behaviour

如果QImage是Format_ARGB32_Premultiplied (首选格式),那么您需要将每个像素转换为OpenCV的BGR布局。在最新版本中,cv::cvtcolor()函数可以将ARGB转换为RGB。

或者,您可以在复制数据之前使用QImage::convertToFormat()转换为RGB。

票数 9
EN

Stack Overflow用户

发布于 2014-04-24 15:03:05

在你提出这个问题一年后,互联网上已经有了很好的答案:

但在我看来,如果你同时使用Qt和OpenCV,那么输入QImage可能是,只是为了显示,在这种情况下,你可能会想要使用QPixmap,因为它针对显示进行了优化。这就是我要做的:

  1. 将图像加载为cv::Mat,如果您想显示图像,请使用第二篇文章中介绍的非复制方法转换为QPixmap
  2. 在工作流期间以
  3. 时间进行图像处理您可以调用类似Mat2QPixmap()的东西来获取实时result.
  4. Never将QPixmap转换为cv::Mat,考虑到每种类型的用途,这样做是没有意义的。<代码>H226<代码>G227
票数 11
EN

Stack Overflow用户

发布于 2019-02-15 10:56:22

这个问题的答案是Qt 5.11 (可能还有一些更早的版本):

代码语言:javascript
运行
复制
    cv::Mat mat(image.height(), image.width(),CV_8UC3, image.bits());  
    // image.scanline() does not exist, 
    //and height/width is interchanged for a matrix

同样,假设QImage为RGB888 (即QImage::Format_RGB888)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11886123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档