2016-04-11 5 views
1

Warum wirkt sich ein Bild auf ein anderes Bild aus, das mit dem Originalbild erstellt wurde?Das Bild der zweiten Matte zeigt das Ergebnis der ersten Matte image

Hier ist ein Beispiel, in dem ich mit dem obigen Problem konfrontiert bin.

Mat src = imread ("A.jpg"); 
Mat src1 = src; 
Mat src2 = src; 

Process (src1); 
imshow ("src1_result", src1); 
imshow ("src2", src2); 

Hinweis: "SRC2", zeigt das Ergebnis von src1 und , dass meine Frage ist. **Warum?. Auch wenn ich src2 wieder mit orignal-Bild einstelle, wie unten gezeigt.

Noch, src2, zeigt das Ergebnis von src1.

Warum?, Jeder hat dieses Problem gesehen?

+2

es ist eine Referenz genommen, wenn Sie eine Kopie wollen, rufen Sie dann 'klonen', um eine tiefe Kopie zu machen, so dass es eine eigene Kopie hat – EdChum

+0

Danke. Ich verstehe jetzt. Und hatte es behoben. Aber was ist dann der Zweck der Bezugnahme? Wo können wir es verwenden? – Abc

+0

Weil Kopieren ist teuer und was passiert, wenn Sie diese als Parameter an eine Funktion übergeben? – EdChum

Antwort

3

Wenn Sie src2 = src1 tun, src2 ist kein Klon von src1, sondern es weist nur auf die gleiche Stelle Speicher src1 ‚s Pixelwerte enthält. Es ist nur so, wie opencv zu Optimierungszwecken funktioniert.

Sie können dies selbst überprüfen, indem Sie beide Variablen '.data Zeiger überprüfen, der auf Pixelwerte zeigt. In Ihrem Beispielcode sind sowohl src1.data als auch src2.data identisch.

Was Sie interessieren würde ist eher src2 = src1.clone(); nur dann src1 und src2 sind unabhängig.

+0

Ja, danke aber dann Was ist der Zweck der Bezugnahme auf ein Bild. wie src1 = src, ich bin interessiert, ein Beispiel zu sehen, wo die Referenz hilft. – Abc

+1

Wenn Sie oben auf meinem Kopf eine Funktion haben, die eine Matte einliest, 'foo (Mat a)', kopiert Ihr Programm bei jedem Aufruf der Funktion die gesamte Matte hin und her. – aybassiouny

+0

Der Zweck ist, nicht das ganze Bild (wahrscheinlich mehrere MBs) die ganze Zeit zu kopieren, um die Dinge zu beschleunigen! – Micka

1

alle Objekte src1, scr2, src Punkt auf die gleichen Daten

in OpenCV wenn zugewiesen Mat Objekt wie auf diese Weise src1 = src, src2 = src dann alle Mat Objektpunkt auf die gleichen Signaldaten, sondern mit diffirent Header,

Versuchen Sie stattdessen

Mat src1 = src.clone(); 

oder

Mat src2; 
src.copyTo(src2); 
Verwandte Themen