2016-07-21 8 views
1

私はstd::vector<cv::Mat> descriptorsを持っています。ここで、descriptor[i]は私のデータセットのi-thイメージの記述子行列です。あるcv :: Matを別のものにプッシュするとコピーされますか?

私は何をするつもりだ場合:

cv::Mat descriptorsMat; 
for(const auto mat : descriptors) 
    descriptorsMat.push_back(mat); 

は、それが(時間とメモリの両方で非効率的である)descriptorsMatの終わりにコピーmatに起こっているか、それがを追加する予定です参照matdescriptorsMatの末尾にあります(これは効率的ですが、安全ではないと考えられます)。

私はこの必要とする理由:私はこれらの記述子行列でVLFeatからVlGMMを訓練するつもりですので、を、私はfloat *内のすべてのデータをロードする必要があります。私はdescriptorsMatを得る一度だから、私は何をするつもりです:

if(!descriptorsMat.isContinous()){ 
    std::err<<"Descriptor matrix not continuous!"<<std::endl; 
    return 1; 
} 
float *data = new float[descriptorsMat.total()]; 
std::memcpy(data,descriptorsMat.data,descriptorsMat.total() * sizeof(float)); 

あなたが任意のより良い代替ソリューションを持っている場合は、それを投稿してください!

+0

コピーを実行します。 –

+0

これは悪いニュースです。私は、唯一の解決策は 'descriptor'の各要素の' data'に 'std :: memcopy'を慎重に連結していると思います。 – justHelloWorld

+0

' std :: memcpy'はメンバーワイズコピーよりも優れていません。 –

答えて

2

このコードは、実際のデータ要素に何らかのヘッダーまたはスマートポインタであるMatオブジェクトのみをコピーします。

cv::Mat descriptorsMat; 
for(const auto mat : descriptors) 
     descriptorsMat.push_back(mat); 

Matオブジェクトはコピーしていますが、データはコピーしていません。 Matオブジェクトはスマートポインタに似ています。データ参照を数えるリファレンスです。 Matデータを詳細にコピーするには、mat.cloneまたはmat.copyToを呼び出す必要があります。

+0

これは割り当ての場合もありますが、push_back()は実際に[ディープコピー]を行います(https://github.com/opencv/opencv /blob/master/modules/core/src/matrix.cpp#L821) – s1h

+0

@ s1h push_backはオブジェクトをコピーしますが、この場合のオブジェクト(cv :: Mat)はあまりスマートなポインタではありません。 – Micka

+0

[this](http://stackoverflow.com/questions/38512158/image-retrieval-through-fisher-vectors-why-my-implementation-works-so-bad)の質問をお願いします。 – justHelloWorld

関連する問題