我对cv :: Mat对象有一些问题。输出以下代码是错误的
void processFrame(const cv::Mat image, MyTracker& t)
{
//some code
}
void main()
{
MyTracker t;
cv::VideoCapture(0);
cv::Mat im , im_gray;
while (true)
{
cap >> im;
cv::cvtColor(im, im_gray, CV_BGR2GRAY);
processFrame(im_gray,t);
cv::Rect r = t.bb_rot.boundingRect(); // get last bounding box of tracker
std::cout<<r.x<<"\t"<<r.y<<"\t"<<r.width<<"\t<<r.height;
}
}
但是当我使用processFrame(im_gray.clone(),t);
代替时,解决了问题并且结果是正确的。
clone()
函数可以解决此问题的问题是什么,但processFrame
的第一个参数是const cv::Mat image
,并且ProcessFrame
无法更改。
我认为image
对象将在processFrame
函数
答案 0 :(得分:0)
cv::Mat
就像一个智能指针。运行以下代码时:
cv::Mat a = cv::Mat(...);
cv::Mat b = a;
您有两个对象:a
和b
,它们指向相同的data
。最后一个被破坏也将释放内存。
因此,在您的情况下,您没有更改所获得的const
矩阵的任何值,而是更改数据,这些数据由所有数据共享。
当您使用clone()
方法时,实际上会分配一个新的数据缓冲区并将数据复制到它。
我希望它能回答你的问题,你可以在这里阅读更多内容:cv::Mat docs