C# 如何在c中使用emgu cv比较两幅静止图像#

C# 如何在c中使用emgu cv比较两幅静止图像#,c#,winforms,emgucv,C#,Winforms,Emgucv,已经在Stackoverflow.com和google上搜索过了。但是除了下面显示的链接外,没有找到任何合适的方法来执行此操作 请提出建议或提供有用的反馈,以便我可以开始使用该应用程序。请查看Emgu CV API文档,了解该类的方法 它包含计算两幅图像之间绝对差异的方法。它还提供了获取两个图像之间差异的比较掩码 要获得描述差异的单个值,可以使用该方法提供的每个通道的非零像素数。然后找到具有最大变化(非零)像素数的通道。要得到一个相对值(百分比),只需将其除以宽度*高度(图像中的像素总数)。我

已经在Stackoverflow.com和google上搜索过了。但是除了下面显示的链接外,没有找到任何合适的方法来执行此操作


请提出建议或提供有用的反馈,以便我可以开始使用该应用程序。

请查看Emgu CV API文档,了解该类的方法

它包含计算两幅图像之间绝对差异的方法。它还提供了获取两个图像之间差异的比较掩码


要获得描述差异的单个值,可以使用该方法提供的每个通道的非零像素数。然后找到具有最大变化(非零)像素数的通道。要得到一个相对值(百分比),只需将其除以
宽度*高度(图像中的像素总数)。

我认为您需要的是:

image1 = image2 - image1;
由于运算符重载,这可以直接在
Emgu CV
中实现。 下面是一段代码片段,可以帮助您使用
Emgu CV
lib实现您的目标

Image<Gray, Byte> img1 = new Image<Gray, Byte>("C:\\image1.png"); 
Image<Gray, Byte> img2 = new Image<Gray, Byte>("C:\\image2.png"); 
Image<Gray, Byte> img3 = img2 - img1; //Here the difference is applied.
Image img1=新图像(“C:\\image1.png”);
Image img2=新图像(“C:\\image2.png”);
图像img3=img2-img1//这里应用了差异。

谢谢

如果您想在比较两幅图像后获得一个值,可以在EmguCV中使用MatchTemplate API

Image<Gray, float> resultImage = sourceImage.MatchTemplate(templateImage, Emgu.CV.CvEnum.TemplateMatchingType.CcoeffNormed);
                    double[] minValues, maxValues;
                    Point[] minLocations, maxLocations;
resultImage.MinMax(out minValues, out maxValues, out minLocations, out maxLocations);
Image resultImage=sourceImage.MatchTemplate(templateImage,Emgu.CV.CvEnum.TemplateMatchingType.CcoeffNormed);
双[]最小值,最大值;
点[]最小位置,最大位置;
最小值(输出最小值、输出最大值、输出最小位置、输出最大位置);

maxValues[0]将为您提供一个介于0-1之间的值,接近1,这意味着使用EmguCV的AbsDiff方法进行更多匹配

       using (Image<Gray, byte> sourceImage = new Image<Gray, byte>(_orgImage))
        {
        using (Image<Gray, byte> templateImage = new Image<Gray, byte>(_refImage))
        {
            Image<Gray, byte> resultImage = new Image<Gray, byte>(_bufferParams.MaskDetails.width, _bufferParams.MaskDetails.height);
            CvInvoke.AbsDiff(sourceImage, templateImage, resultImage);
            //resultImage.Save(@"some path" + "imagename.jpeg");
            int diff = CvInvoke.CountNonZero(resultImage);
            //if diff = 0 exact match, otherwise there are some difference.
         }     
        }
使用(图像源图像=新图像(_orgImage))
{
使用(图像模板图像=新图像(_refImage))
{
Image resultImage=新图像(_bufferParams.MaskDetails.width,_bufferParams.MaskDetails.height);
CvInvoke.AbsDiff(sourceImage、templateImage、resultImage);
//resultImage.Save(@“some path”+“imagename.jpeg”);
int diff=CvInvoke.CountNonZero(resultImage);
//如果diff=0,则完全匹配,否则会有一些差异。
}     
}

您是否在@Nimesh上查看了本教程?我需要将草图图像与普通彩色图像进行比较。因此,这对您发布示例图像没有帮助吗?我的草图图像:我的彩色图像:在这里,您必须使用扩展的统一圆形局部二进制模式(EUCLBP)来比较草图图像和数字图像。AbsDiff在图像格式上给我提供了差异,但我需要百分比或任何十进制值的差异。有可能吗???嗨,我添加了一个简单的方法来获得一个值来描述两幅图像的差异。但是它很粗糙,而且是从我的头顶上看的,因为我很久以前就用过这个图书馆。。希望helps@andyp你所说的
是什么意思,然后找到具有最大变化(非零)像素数的通道。
我该怎么做?我还想计算两幅图像之间的差异百分比或图像的相似性百分比。你能帮我解决这个问题吗@Amooh你找到解决方案了吗?这给我带来了一个错误,比如“操作既不是‘数组操作数组’(数组大小和通道数相同),也不是‘数组操作标量’,也不是‘标量操作数组’。。。你能帮忙吗?这不是一种量化或检测图像差异及其存在位置的可靠方法。努曼,请看我在这篇文章中的另一个答案。使用EmguCV的AbsDiff方法。