2016-07-12 11 views
1

Der folgende CodeWas macht die Deallocate-Methode von cv :: Mat?

int main(int argc, char** argv) 
{ 
    cv::Mat1b i1(cv::Size(1, 2)); 
    i1.at<uchar>(0, 0) = 1; 
    i1.at<uchar>(1, 0) = 1; 

    cv::Mat1b mask(i1.size()); 
    mask.at<uchar>(0, 0) = 1; 
    mask.at<uchar>(1, 0) = 0; 

    cv::Mat1b masked; 
    mask.copyTo(masked, mask); 

    masked.release(); //or .deallocate() 
    cout << masked << endl; 
    i1.copyTo(masked, 1 - mask); 
    cout << masked << endl; 
    return 0; 
} 

verhält sich ganz anders, wenn masked.release() durch masked.deallocate() ersetzt wird. Im letzteren Fall scheint die Matrix masked überhaupt nicht modifiziert zu sein, und die Ausgabe masked ist die Summe der maskierten und invertierten maskierten Matrizen, also gleich der ursprünglichen im1 Matrix. Was macht deallocate() Member-Methode eigentlich? Ich benutze openCV 3.1.

+0

[Mat :: release] (http://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#ae48d4913285518e2c21a3457017e716e). Wenn Sie das Objekt nach dem Aufruf von 'deallocate()' verwenden, haben Sie wahrscheinlich ein undefiniertes Verhalten. – melak47

+0

Ich würde denken, dass 'release()' und 'deallocate()' das gleiche tun. Und beide sollten das Objekt in einem "klaren" Zustand belassen. – hovo

+0

Ausgenommen die Dokumentation besagt eindeutig, dass 'release()' und 'deallocate()' nicht dasselbe tun :) – melak47

Antwort

2

deallocate() werden die Daten direkt von der cv::Mat freigeben. release() wird jedoch nur die der cv::Mat verringern und wenn es 0 trifft, wird es deallcoate von selbst aufrufen.

Zusammenfassung: Verwenden Sie release immer, bis Sie wissen, was Sie tun.

Beachten Sie auch, dass Sie keine von ihnen aufrufen müssen. release wird während des Destruktors von cv::Mat aufgerufen.

P.S mit den Daten von cv::Mat nach Freigabe wird als undefiniertes Verhalten betrachtet.

1

Während Mat::deallocate() freigibt, die Matrix, Mat::release() verringert den Bezugszähler und freigibt, wenn die Matrix benötigt. Wenn release() verwendet wird, wenn die Referenzzahl 0 erreicht, wird Mat freigegeben, während deallocate() die Zuordnung immer auflöst. Weitere Informationen HERE