cv :: Mat to QImage转换

krz*_*ych 5 qt opencv

我发现了一个非常类似的话题:如何将opencv cv :: Mat转换为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;
}
Run Code Online (Sandbox Code Playgroud)

它适用于我,但我想让它更有效率.第一:为什么更改2个cvtColor函数:

cv::cvtColor(mat,rgb,CV_GRAY2BGRA)
Run Code Online (Sandbox Code Playgroud)

失败了

QImage returnImage = temp.copy() 
Run Code Online (Sandbox Code Playgroud)

与segfault.

那么如何消除QImage的复制.当我简单地返回临时图像时,我会遇到段错误.

那里可以做任何其他优化吗?它经常被使用,所以我希望尽可能快地使用它.

ypn*_*nos 4

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

您的问题是必须从灰度转换为彩色或 RGBA。一旦需要这种对话,自然就需要数据的副本。

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

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

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