3

我需要比较两个图像并以百分比的形式识别它们的差异。emgucv 上的“Absdiff”功能对此无济于事。我已经在 emgucv wiki 上完成了比较示例。我真正想要的是如何以数字格式获得两个图像差异?

//emgucv wiki compare example

//acquire the frame
Frame = capture.RetrieveBgrFrame(); //aquire a frame
 Difference = Previous_Frame.AbsDiff(Frame);
//what i want is
double differenceValue=Previous_Frame."SOMETHING";

如果您需要更多详细信息,请询问。提前致谢。

4

2 回答 2

0

基于 EmguCV MatchTemplate 的比较

Bitmap inputMap = //bitmap  source image
Image<Gray, Byte> sourceImage = new Image<Gray, Byte>(inputMap);

Bitmap tempBitmap = //Bitmap template image
Image<Gray, Byte> templateImage = new Image<Gray, Byte>(tempBitmap);

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

double percentage = maxValues[0] * 100; //this will be percentage of difference of two images

两个图像需要具有相同的宽度和高度,否则 MatchTemplate 会抛出异常。如果我们想要完全匹配。或者模板图像应该小于源图像以获得模板图像在源图像上出现的次数

于 2020-02-25T13:04:43.290 回答
0

基于 EmguCV AbsDiff 的比较

Bitmap inputMap = //bitmap  source image
Image<Gray, Byte> sourceImage = new Image<Gray, Byte>(inputMap);

Bitmap tempBitmap = //Bitmap template image
Image<Gray, Byte> templateImage = new Image<Gray, Byte>(tempBitmap);

Image<Gray, byte> resultImage = new Image<Gray, byte>(templateImage.Width, 
templateImage.Height);

CvInvoke.AbsDiff(sourceImage, templateImage, resultImage);

double diff = CvInvoke.CountNonZero(resultImage);

diff = (diff / (templateImage.Width * templateImage.Height)) * 100; // this will give you the difference in percentage

根据我的经验,与基于 MatchTemplate 的比较相比,这是最好的方法。匹配模板未能捕获两个图像中非常小的变化。但是 AbsDiff 也将能够捕捉到非常小的差异

于 2020-07-15T15:20:08.467 回答