我找到了非常相似的话题: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()
使用segfault。
然后,如何消除对QImage的复制。当我简单地返回temp image时,我得到了segfault。
还有没有其他的优化可以在那里完成?这是非常常用的功能,所以我想让它尽可能快。
发布于 2012-06-14 00:08:31
你对这个问题的解决方案效率不高,特别是它的效率比我在你链接的另一个问题上发布的代码要低。
您的问题是,您必须转换从灰度到颜色,或RGBA。一旦你需要这个对话,自然就需要一份数据的副本。
我的解决方案同时进行灰度和颜色之间的转换,以及cv::Mat和QImage之间的转换。这就是为什么它是你能得到的最有效的。
在您的解决方案中,首先尝试转换,然后想要直接围绕OpenCV数据构建QImage,以便保留第二个副本。但是,您所指向的数据是临时的。一旦你离开这个函数,cv::Mat free就会占用它的相关内存,这就是为什么它在QImage中也不再有效。您可以事先手动增加cv::Mat的引用计数器,但这会为以后的内存泄漏打开大门。
最后,你尝试以一种干净的方式来解决一个更好的问题的肮脏解决方案。
https://stackoverflow.com/questions/11015481
复制相似问题