具有const cv :: Mat类型的参数将在函数中更改?

时间:2016-04-23 13:27:26

标签: c++ opencv

我对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函数

中发生变化

1 个答案:

答案 0 :(得分:0)

cv::Mat就像一个智能指针。运行以下代码时:

cv::Mat a = cv::Mat(...);
cv::Mat b = a;

您有两个对象:ab,它们指向相同的data。最后一个被破坏也将释放内存。 因此,在您的情况下,您没有更改所获得的const矩阵的任何值,而是更改数据,这些数据由所有数据共享。 当您使用clone()方法时,实际上会分配一个新的数据缓冲区并将数据复制到它。

我希望它能回答你的问题,你可以在这里阅读更多内容:cv::Mat docs