2016-04-23 11 views
2

私はcv :: Matオブジェクトにいくつか問題があります。以下のコードの出力はconst cv :: Mat typeのパラメータは関数内で変更されますか?

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 .com/questions/23468537/difference-of-use-const-cvmat-cvmat-cvmat-or-const-cvmat) – herohuyongtao

答えて

0

cv::Matを変更すると思い

はスマートポインタのようなものです。次のコードを実行すると:aと同じdataを指すb

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

を次の2つのオブジェクトがあります。最後のものは破壊され、メモリも解放されます。 あなたのケースでは、あなたが得たconstマトリックスの値を変更していない、あなたはそれらのすべてによって共有されているデータを変更しています。 clone()メソッドを使用すると、実際に新しいデータバッファを割り当てて、そのデータをそのデータにコピーします。

私はあなたがもっとここで読むことができ、それは、あなたの質問に答える願っています:cv::Mat docs

+0

タンク。しかし、なぜ私はconstオブジェクトが関数で変更されるのか分からないのですか? –

+1

オブジェクト自体は単なるメタデータであり、バッファへのポインタ(画像データ)です。 constは、メタデータ(サイズ、タイプなど)を変更できないことを意味しますが、データ自体が変更される可能性があります。 – zenpoy

関連する問題