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



我对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;

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

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

相关内容

最新更新