一、前言:
在最近项目中,因为涉及到图像识别相关的模块,所以使用了Opencv,但是发现在转化图片过程中出现了一些问题。
二、问题
在调用Mat转化Image中 在cvtColor(img_bgr, cv2.COLOR_BGR2RGB) 转化中会改变作为形参的mat:代码如下:
QImage XRLEDSMatch::Mat_to_Imag(cv::Mat mat)
{
cvtColor(mat, mat, cv::COLOR_BGR2RGB); //先转换
QImage img = QImage((uchar*)mat.data, mat.cols, mat.rows, QImage::Format_RGB888);
return img;
}
转后后会影响到外面的mat值,然后我再次传入后mat的值已经是转化后的了。所以这个问题解决的方案是再return QImge的时候再一次转化回去。
QImage XRLEDSMatch::Mat_to_Imag(cv::Mat mat)
{
cvtColor(mat, mat, cv::COLOR_BGR2RGB); //先转换
QImage img = QImage((uchar*)mat.data, mat.cols, mat.rows, QImage::Format_RGB888);
cvtColor(mat, mat, cv::COLOR_BGR2RGB); //再复原
return img;
}
但是发现和预期的不一样因为Img里面的值在return前同样被改变了一次,是因为我们用的浅拷贝里面的值还是对应的mat所以在mat转化回去后Image里面的值又变回去了。
我们应该:
QImage((uchar*)mat.data, mat.cols, mat.rows, QImage::Format_RGB888).copy();//深拷贝
这样就算改变了mat也不会再次改变image里面的值。