首先下载Delphi-OpenCV
下载地址:GitHub - Laex/Delphi-OpenCV: Project Delphi-OpenCV. Translation of OpenCV library header files in Delphi
国际惯例先上代码
program CompareImage;{$APPTYPE CONSOLE}{$R *.res}usesSystem.SysUtils,ocv.core.types_c in 'ocv.core.types_c.pas',ocv.core_c in 'ocv.core_c.pas',ocv.highgui_c in 'ocv.highgui_c.pas';ConstfilenameL = 'l.bmp';filenameR = 'r.bmp';VarimageL:pIplImage = nil;imageR:pIplImage = nil;imageDiff:pIplImage = nil;begintryimageL := cvLoadImage(filenameL, 1); //-1 默认读取图像的原通道数 ,0 强制转化读取图像为灰度图 ,1读取彩色图imageR := cvLoadImage(filenameR, 1);if Assigned(imageL) and Assigned(imageR) thenbegincvNamedWindow('imageL', CV_WINDOW_AUTOSIZE);cvShowImage('imageL', imageL);cvNamedWindow('imageR', CV_WINDOW_AUTOSIZE);cvShowImage('imageR', imageR);imageDiff:= cvCreateImage(cvGetSize(imageL),imageL.depth,imageL.nChannels);if Assigned(imageDiff) thenbegincvAbsDiff(imageL,imageR,imageDiff);cvNamedWindow('imageDiff', CV_WINDOW_AUTOSIZE);cvShowImage('imageDiff', imageDiff);end;cvWaitKey();cvDestroyWindow('imageL');cvDestroyWindow('imageR');cvDestroyWindow('imageDiff');cvReleaseImage(imageL);cvReleaseImage(imageR);cvReleaseImage(imageDiff);Readln;end;Readln;excepton E: Exception doWriteLn(E.ClassName, ': ', E.Message);end;end.
大家一起来找茬对比效果:
说实话,这玩意功能是真的很强大,之前我在就写过一个基于像素RGB对比的Delphi版大家来找茬的辅助,一直可以使用,一直到底失效了,原因就是QQ游戏更新增加了反作弊处理,左右两幅图片进行了增加躁点,图像背景干扰等差异化处理,导致程序无法进行RGB像素扫描处理这些图片,包括连灰阶处理,二值化都成问题,今天一试这opencv居然秒搞定。真是彪悍!
之前的辅助效果图:
现在用像素对比的话,是全红的。即所有的点都不匹配,如果转灰度图(左下)或二值化(右下),是如下效果(只能操作一部分,很是奇怪)
这根本不符合逻辑,同样的代码转其它的图片正常的很
用的也是国际通用公式计算:
灰度化过程还是依照大多数图像灰度处理惯例,计算YUV颜色空间的Y分量作为灰度图,
公式为:Y = 0.299 * R + 0.587 * G + 0.114 * B
不知道是什么原因。没去细查。
以后会多研究一下opencv,毕竟在人脸识别,图像分析对比,物品识别,运动图像捕捉,人工智能,视频预警监控等众多领域opencv都表现的足够优秀。而且使用又是如此简单。
如果觉得《Delphi中小试Opencv--图像差异对比(大家来找茬辅助实现cvAbsDiff函数的使用)》对你有帮助,请点赞、收藏,并留下你的观点哦!