私は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
に起こっているか、それがを追加する予定です参照のmat
はdescriptorsMat
の末尾にあります(これは効率的ですが、安全ではないと考えられます)。
私はこの必要とする理由:私はこれらの記述子行列で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));
あなたが任意のより良い代替ソリューションを持っている場合は、それを投稿してください!
コピーを実行します。 –
これは悪いニュースです。私は、唯一の解決策は 'descriptor'の各要素の' data'に 'std :: memcopy'を慎重に連結していると思います。 – justHelloWorld
' std :: memcpy'はメンバーワイズコピーよりも優れていません。 –