2017-07-17 93 views
0

我尝试使用两个图像参数来控制项目中的图像。问题是,当我在Emgu CV中应用任何公共无效函数后无法重新分配图像时。 这是我的代码:EMGU CV重新分配图像

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

当我检查到的复选框以应用功能__EqualizeHist(),它自动应用功能以调整第一PIC到第二PIC(如附加的图像)。然而,当我取消,但不回我的root_Pic(第二张图先PIC) This is the demonstration for my code

回答

0

问题是,当你复制相似图片

Global.xrayPic = Global.rootPic; 

然后Global.rootPic的参考被复制到Global.xrayPic这意味着这两个对象将指向相同的图像在存储器,要么Global.rootPicGlobal.xrayPic的任何变化将导致在这两个变化。

解决方案:

使用图像的深度复制像这样

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

如果你想emgucv图像从1个变量复制到另一个它始终是一个好主意,克隆他们。

我希望这将解决您的问题,如果你有任何其他问题,他们复制在这里。

+0

它的工作!非常感谢! –

+0

我的疑问是为什么?将一个图像变量的值分配给另一个图像变量并将第一个图像克隆到第二个图像变量之间有什么区别? –

+0

@PabloGonzalez直接赋值并不实际赋值为“Value”,而只是复制其地址。这就是为什么他需要深层复制。如果你仍然怀疑,那么研究浅层和深层复制的概念。 –