qt - cv::Mat 到 QImage 的转换

标签 qt opencv

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

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

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 函数:

cv::cvtColor(mat,rgb,CV_GRAY2BGRA)

失败了

QImage returnImage = temp.copy() 

有段错误。

然后如何消除QImage的复制。当我简单地返回临时图像时,我遇到了段错误。

还有其他优化可以在那里完成吗?这是一个经常使用的函数,所以我想尽快完成它。

最佳答案

您对问题的解决方案效率不高,特别是它的效率低于我在您链接到的其他问题上发布的代码。

您的问题是您必须将灰度转换为彩色或 RGBA。只要您需要此对话,自然就需要一份数据副本。

我的解决方案同时进行了灰度和颜色之间的转换,以及 cv::Mat 和 QImage 之间的转换。这就是为什么它是您可以获得的最高效的原因。

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

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

关于qt - cv::Mat 到 QImage 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11015481/

相关文章:

c++ - 如何根据平台排除Qt中的某些文件

c++ - 在 For 循环中声明多个变量然后分配这些变量数据

c++ - Qt - 如何从 const 函数追加到本地列表

c++ - OpenCV的projectPoints函数

OpenCV 相当于 np.where()

python - 如何使用 Python OpenCV 从 OCR 图像中去除噪声伪影?

qt - ubuntu 上的 QGLWidget 什么也没显示

c++ - Qt 排队连接中的槽调用顺序

c++ - OPENCV 链接错误 - Win32 和 VS2012

c++ - 在 C++ 中通过 OpenCV 以非常小的步骤翻译图像