我对cv::Mat object有一些问题。以下代码的输出错误
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
函数中发生变化
cv::Mat
就像一个智能指针。运行以下代码时:
cv::Mat a = cv::Mat(...);
cv::Mat b = a;
您有两个对象:a
和 b
指向同一data
。最后一个被破坏也会释放内存。因此,在您的情况下,您不会更改您获得的const
矩阵的任何值,而是在更改由所有人共享的数据。使用clone()
方法时,实际上会分配一个新的数据缓冲区并将数据复制到其中。
我希望它能回答你的问题,你可以在这里阅读更多: cv::Mat docs