首先下载Delphi-OpenCV
下载地址:https://github.com/Laex/Delphi-OpenCV
国际惯例先上代码
program CompareImage; {$APPTYPE CONSOLE} {$R *.res} uses System.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'; Const filenameL = 'l.bmp'; filenameR = 'r.bmp'; Var imageL:pIplImage = nil; imageR:pIplImage = nil; imageDiff:pIplImage = nil; begin try imageL := cvLoadImage(filenameL, 1); //-1 默认读取图像的原通道数 ,0 强制转化读取图像为灰度图 ,1读取彩色图 imageR := cvLoadImage(filenameR, 1); if Assigned(imageL) and Assigned(imageR) then begin cvNamedWindow('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) then begin cvAbsDiff(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; except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; end.大家一起来找茬对比效果:
说实话,这玩意功能是真的很强大,之前我在2009年就写过一个基于像素RGB对比的Delphi版大家来找茬的辅助,一直可以使用,一直到2016年底失效了,原因就是2016年QQ游戏更新增加了反作弊处理,左右两幅图片进行了增加躁点,图像背景干扰等差异化处理,导致程序无法进行RGB像素扫描处理这些图片,包括连灰阶处理,二值化都成问题,今天一试这opencv居然秒搞定。真是彪悍!
之前的辅助效果图:
现在用像素对比的话,是全红的。即所有的点都不匹配,如果转灰度图(左下)或二值化(右下),是如下效果(只能操作一部分,很是奇怪)
这根本不符合逻辑,同样的代码转其它的图片正常的很
用的也是国际通用公式计算: 灰度化过程还是依照大多数图像灰度处理惯例,计算YUV颜色空间的Y分量作为灰度图, 公式为:Y = 0.299 * R + 0.587 * G + 0.114 * B
不知道是什么原因。没去细查。
以后会多研究一下opencv,毕竟在人脸识别,图像分析对比,物品识别,运动图像捕捉,人工智能,视频预警监控等众多领域opencv都表现的足够优秀。而且使用又是如此简单。