2017-07-17 6 views
0

Ich versuche, zwei Bildparameter zu verwenden, um mein Bild im Projekt zu steuern. Das Problem ist, dass wenn ich Bild nicht zuweisen kann, nach dem Anwenden von öffentlichen Void-Funktionen in Emgu CV. Dies ist mein Code:EMGU CV neu zugeordnetes Bild

public static class Global 
{ 
    public static Image<Gray, byte> xrayPic; 
    public static Image<Gray, byte> rootPic; 
} 

private void takePhotoBtn_Click(object sender, EventArgs e) 
{ 
    Image<Bgr, Byte> ImageSrc = new Image<Bgr, Byte>(_subPath); 
    Image<Gray, Byte> GrayImage = ImageSrc.Convert<Gray, byte>(); 
    Image<Gray, Byte> MedianImage = GrayImage.SmoothMedian(5); 

    Global.xrayPic = MedianImage; 
    Global.rootPic = MedianImage; 

    Global.xrayPic.Save(_subPath); 
    imgBox.Image.Dispose(); 
    imgBox.Image = Global.xrayPic.Bitmap;  
} 

private void checkHistogram_CheckedChanged(object sender, EventArgs e) 
{ 
    if(checkHistogram.Checked) 
    { 
     Image<Gray, byte> tmpPic = Global.xrayPic; 
     tmpPic._EqualizeHist(); 
     // Global.xrayPic._EqualizeHist(); 
     imgBox.Image.Dispose(); 
     imgBox.Image = tmpPic.Bitmap; 
    } 

    if(checkHistogram.Checked == false) 
    { 
     Global.xrayPic = Global.rootPic; 
     imgBox.Image.Dispose(); 
     imgBox.Image = Global.xrayPic.Bitmap; 
    } 
} 

Als ich in den Checkbox die Funktion __EqualizeHist() anzuwenden, es angewandte Funktion automatisch erstes Bild zu dem zweiten Bild (wie angehängtes Bild) einzustellen. Allerdings, wenn ich deaktivieren, es nicht zu meinem root_Pic (zweites Bild zum ersten Bild) zurückkehrt This is the demonstration for my code

Antwort

0

Das Problem ist, wenn man Bilder wie diese

Global.xrayPic = Global.rootPic; 

dann die Referenz von Global.rootPic kopieren zu Global.xrayPic kopiert was bedeutet, beide Objekte auf dasselbe Bild in der Speicherpunkt wird, werden alle Änderungen an beiden Global.rootPic oder Global.xrayPic wird sowohl in Änderung führen.

Lösung:

Verwenden Sie die tiefe Kopie der Bilder wie diese

Global.xrayPic = Global.rootPic.Clone(); 

Wenn Sie emgucv Bild von 1 Variable zum anderen ist es immer eine gute Idee, Klon kopieren möchten Sie.

Ich hoffe, dies wird Ihr Problem lösen, wenn Sie ein anderes Problem haben, kopieren sie hier.

+0

Es hat funktioniert! Ich danke dir sehr! –

+0

mein Zweifel ist warum? Was ist der Unterschied zwischen dem Zuweisen eines Wertes von einer Bildvariablen zu einer anderen und dem Klonen der ersten in die zweite? –

+0

@PabloGonzalez Weisen Sie einem Wert direkt den Wert zu, statt dessen kopiert er nur seine Adresse. Deshalb brauchte er die tiefe Kopie. Wenn Sie immer noch Zweifel haben, dann studieren Sie das Konzept der flachen und tiefen Kopie. –

Verwandte Themen