OpnCV _ C++ _引数の & と const のありなし

型の前の &参照を示す宣言子。

参照したサイトでは cv::Mat 型だが、他の型も挙動は同じ ? かと。

 

以下の違い。
cv::Mat
const cv::Mat
cv::Mat&
const cv::Mat&

 

前知識 Memo -- cv::Mat のコピー --

cv::Mat は代入演算子を使うと、浅いコピーが行われ
コピー元とコピー先で cv::Mat のデータが共有される。

同じメモリアドレスを指しているので、
コピー元の cv::Mat データを書き換えるとコピー先のデータも変わる

コピー元とコピー先を別データとしてコピーするには
clone を利用して深いコピーを行う。

 

引数: cv::Mat

cv::Mat のコピーを渡す。
関数内で Input のデータを変更することは出来るが、
関数内で変更しても関数外の cv::Mat は変更されない

    void Hoge (cv::Mat Input)
    {
        Input = Mat::zeros(cv::Size(160,100), CV_8U);
        // 要素全て 0 の w160 * h100 の mat
    }

 

引数: const cv::Mat

 cv::Mat のコピーを渡す。
関数内で Input のデータを変更することは出来ない

    void Hoge(const cv::Mat Input)
    {
        Input = Mat::zeros(cv::Size(160,100), CV_8U);
        // エラーとなる。
    }

 

引数: cv::Mat&

cv::Mat の参照を渡す。
関数内で Input のデータを変更すると、
関数外の cv::Mat データ書き換わる

    void Hoge(cv::Mat& Input)
    {
        Input = Mat::zeros(cv::Size(160,100), CV_8U);
    }

 

引数: const cv::Mat&

cv::Mat の参照を渡す。
関数内で Input のデータを変更することは出来ない
変更されないことを保証。

    void Hoge(const cv::Mat& Input)
    {
        Input = Mat::zeros(cv::Size(160,100), CV_8U);
        // エラーとなる。
    }

 

 

こちらから。
https://stackoverflow.com/questions/23468537/differences-of-using-const-cvmat-cvmat-cvmat-or-const-cvmat

cv::Mat の初期化・浅いコピー ↓
http://physics-station.blogspot.jp/2013/03/cvmat.html
http://opencv.jp/cookbook/opencv_mat.html#id3

 

以上。

 

==Memo==

 cv::Mat & で受け取った値は cv::solvePnP( src … ) で使える。
ドキュメント見ると引数が const Mat & だから当たり前だが。

    Hoge(const & cv::Mat a)
    {
        cv::solvePnP( a, … );
       
        cv::Mat b = ~;
        cv::solvePnP( b, … ); //これも可。
    }

↓ これは?前に確かめたら確か結果同じだったが。( a =  b 。違いは & の有無)

    cv::Mat x ~;
    auto result = x * a;
    auto result = x * b;

訳したがものすごく自信ない。

cv::Mat は 行や列の数・型や データへのポインタを保持する
いわゆるヘッダークラス。

cv::Mat でも cv::Mat & でも、ヘッダーを表しており、
実データを示しているわけではない。