Delphi中小试Opencv--图像差异对比(大家来找茬辅助实现cvAbsDiff函数的使用)

首先下载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都表现的足够优秀。而且使用又是如此简单。

 

posted @   IT情深  阅读(400)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示