本文作者:longlongago 博客地址:/longlongago2000
1.问题:最近看到很多人在玩 大家来找茬,于是自己也下载玩了一下,但是由于基础太差,经常都是输多赢少。于是我想到了用OpenCV写个外挂,说干就干。
2.分析:大家来找茬游戏规则简单,只需找出两幅图像的不同点,由此,可以将左右两幅图进行对比,用异或运算将不同点找出。这部分不难,难的主要是定位两幅图的位置,经实验,游戏是两幅图的y方向不边,x方向会随机发生改变,故如果确定两幅图的位置成了这个程序的难点。
3.编程:
第一步,将当前屏幕截取下来。
第二步,分析图像,找出两幅图的具体位置。这里需要点技巧,我是用两幅图像相减去除背景,通过图像处理,将两幅图像
的位置找出。
自己弄个背景图像:
//两图像相减后
cvSub( t,pImg, d, NULL );//双重循环进行像素操作,找到相减后图像的两幅图像的起始位置for(int i=304;i<400;i++){if(x1!=0)break;for(j=180;j<(793+179-7);j++){s=cvGet2D(temp1,i,j); if(s.val[0]==255){if(xx!=0){x1=j;break;}xx=j;yy=i;j=573;}
第三步,通过找到的坐标进行左右两幅图像的异或运算,产生我们要的结果。
找到坐标后截取到左边的图像
右边的图像
输出结果
cvXor( right,left, left, NULL ); //异或运算
第四步,将异或后的图像显示在游戏中的图像上。
void CGameDlg::OnTimer(UINT nIDEvent) //用定时器不断对图像进行刷新显示{CBitmap bmp; bmp.Attach(bitmap);CDC dcMemory;CWnd* pwnd = GetDesktopWindow();//获取当前桌面的设备上下文CDC* pDC = pwnd->GetWindowDC();dcMemory.CreateCompatibleDC(pDC); dcMemory.SelectObject(&bmp); pDC->BitBlt(xx,yy,381,286,&dcMemory,0,0,SRCCOPY); ReleaseDC(pDC); CDialog::OnTimer(nIDEvent);}
到此大功告成!
看看界面:
最后我想说的是,玩游戏是种乐趣,做外挂也是种乐趣,但是不到情非得已的时候,请不要随便使用外挂,破坏游戏的公平性。
此文章只供参考,转载请注明:本文作者:longlongago 博客地址:/longlongago2000
有问题可留言或发邮件讨论。
如果觉得《用VC++ OpenCV写大家来找茬外挂》对你有帮助,请点赞、收藏,并留下你的观点哦!