2016-04-23 55 views
2

我有一些與cv :: Mat對象的問題。下面的代碼的輸出是錯誤的const 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

的墊頭是const的,但不是像素數據。 – Micka

+2

[使用「const cv :: Mat&」,「cv :: Mat&」,「cv :: Mat」或「const cv :: Mat」作爲函數參數的差異的可能重複?](http:// stackoverflow問題/ 23468537 /使用const-cvmat -cvmat -cvmat-or-const-cvmat的差異) – herohuyongtao

回答

0

cv::Mat是像一個智能指針。當您運行下面的代碼:

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

你有兩個對象:ab指向同一data。最後一個受到破壞也會釋放內存。 因此,在您的情況下,您不會更改const矩陣的任何值,而是更改數據,這些數據由所有這些數據共享。 當您使用clone()方法時,您實際上會分配一個新的數據緩衝區並將數據複製到該緩衝區。

我希望這回答了你的問題,你可以在這裏閱讀更多:cv::Mat docs

+0

坦克。但我不明白爲什麼const對象會在函數中改變? –

+1

對象本身只是元數據和指向緩衝區(圖像數據)的指針。 const意味着你不能改變元數據(大小,類型等),但數據本身可以改變。 – zenpoy

相關問題