2016-07-21 11 views
1

Ich habe eine wo descriptor[i] ist die Deskriptoren-Matrix der i-th Bild meines Datensatzes.Eine cv :: Mat in eine andere zu schieben wird es kopieren?

Wenn ich werde tun:

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

ist esmat am Ende descriptorsMat-Kopie gehen (was sowohl zeitlich als auch Speicher ineffizient ist) oder ist es ein hinzufügen gehen Referenz von mat am Ende von descriptorsMat (was ist effizient, könnte aber als unsicher angesehen werden)?

WARUM Ich brauche diese: da ich ein VlGMM von VLFeat mit diesen Deskriptoren Matrix ausbilden werde, brauche ich in einem float * alle Daten zu laden. Also, wenn ich descriptorsMat erhalten, werde ich tun:

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)); 

Wenn Sie irgendwelche bessere Alternative Lösung, bitte per Post!

+0

Es wird eine Kopie, ja. –

+0

Dies ist eine schlechte Nachricht. Ich denke, dass die einzige Lösung ist dann sorgfältig "std :: memcopy" auf "Daten" für jedes Element in "Deskriptoren" verketten – justHelloWorld

+0

'std :: memcpy' ist nicht besser als eine Memberwise-Kopie. –

Antwort

2

Dieser Code kopiert nur das Mat-Objekt, das eine Art Header oder Smart Pointer zu den tatsächlichen Datenelementen ist.

Es kopiert ein Mat-Objekt, aber nicht die Daten. Das Mat-Objekt ähnelt einem Smart-Pointer, dessen Referenz die Datenreferenzen zählt. Um die Mat-Daten tief zu kopieren, müssen Sie mat.clone oder mat.copyTo aufrufen

+0

Dies kann für die Zuweisung der Fall sein, aber push_back() wird tatsächlich eine [tiefe Kopie] (https://github.com/opencv/opencv /blob/master/modules/core/src/matrix.cpp#L821) – s1h

+0

@ s1h push_back wird das Objekt kopieren, aber das Objekt in diesem Fall (cv :: Mat) ist nicht viel mehr als ein intelligenter Zeiger. – Micka

+0

Könnten Sie bitte [this] (http://stackoverflow.com/questions/38512158/image-retrieval-through-fisher-vectors-why-my-implementation-works-so-bad) Fragen stellen? – justHelloWorld