首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cv::Mat到QImage的转换

cv::Mat到QImage的转换
EN

Stack Overflow用户
提问于 2012-06-13 21:06:25
回答 3查看 4.8K关注 0票数 5

我找到了非常相似的话题:how to convert an opencv cv::Mat to qimage,但它并没有解决我的问题。

我有一个将cv::Mat转换为QImage的函数

代码语言:javascript
运行
复制
QImage cvMatToQImg(cv::Mat& mat)
{
    cv::Mat rgb;
    if(mat.channels()==1)
    {
        cv::cvtColor(mat,rgb,CV_GRAY2BGR);
        cv::cvtColor(rgb,rgb,CV_BGR2BGRA);
        QImage temp = QImage((unsigned char*)(rgb.data), rgb.cols, 
                              rgb.rows,QImage::Format_ARGB32 );

        QImage returnImage = temp.copy();
        return returnImage;
}

这对我来说很有效,但我想让它更有效率。第一:为什么使用以下命令更改2个cvtColor函数:

代码语言:javascript
运行
复制
cv::cvtColor(mat,rgb,CV_GRAY2BGRA)

失败时间:

代码语言:javascript
运行
复制
QImage returnImage = temp.copy() 

使用segfault。

然后,如何消除对QImage的复制。当我简单地返回temp image时,我得到了segfault。

还有没有其他的优化可以在那里完成?这是非常常用的功能,所以我想让它尽可能快。

EN

Stack Overflow用户

回答已采纳

发布于 2012-06-14 00:08:31

你对这个问题的解决方案效率不高,特别是它的效率比我在你链接的另一个问题上发布的代码要低。

您的问题是,您必须转换从灰度到颜色,或RGBA。一旦你需要这个对话,自然就需要一份数据的副本。

我的解决方案同时进行灰度和颜色之间的转换,以及cv::Mat和QImage之间的转换。这就是为什么它是你能得到的最有效的。

在您的解决方案中,首先尝试转换,然后想要直接围绕OpenCV数据构建QImage,以便保留第二个副本。但是,您所指向的数据是临时的。一旦你离开这个函数,cv::Mat free就会占用它的相关内存,这就是为什么它在QImage中也不再有效。您可以事先手动增加cv::Mat的引用计数器,但这会为以后的内存泄漏打开大门。

最后,你尝试以一种干净的方式来解决一个更好的问题的肮脏解决方案。

票数 4
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11015481

复制
相关文章

相似问题

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