基于OpenCV与MFC的大家来找茬外挂[升级版]

来源:互联网 发布:网络无线收发器 编辑:程序博客网 时间:2024/05/23 01:13

上次编写的大家来找茬外挂虽然是实现了查找不同区域并把不同的区域显示在屏幕上,但是得手动点击,显得很是麻烦,所以最近把程序又改了一改,实现了自动点击功能。

程序的编写流程:

1.做一幅游戏窗口背景图片Screen(),程序加载的同时加载这幅背景图片t=cvLoadImage("template.dll",1)。

2.进行整个屏幕截图同时获取游戏窗口句柄和游戏窗口位置及其大小。

hWnd = ::FindWindow("",_T("大家来找茬"));

winRect.x=winSize.left;
winRect.y=winSize.top;
winRect.width=winSize.right-winSize.left;
winRect.height=winSize.bottom-winSize.top;

3.根据获得的游戏窗口信息直接从截取的屏幕图片中得到游戏窗口图片。

cvSetImageROI(m_SnapImage,winRect);
cvCopy(m_SnapImage,m_dstImage);

4.将游戏窗口图片和游戏窗口背景图片各个像素进行相减取其绝对值,图像灰度化并二值化。

cvAbsDiff(  t,pImg, d);

cvCvtColor( d, temp1,CV_BGR2GRAY);//灰度化处理后的图像

cvThreshold( temp1, temp1 ,1, 255, CV_THRESH_BINARY ); //以1作为阈值进行二值化

temp1

5.从游戏区域左上角第一点开始向右开始探测,获取左右两幅图像(游戏图像)的左上角位置。

6.由这两个位置直接将左右两幅游戏图像截取出来,同时将这两幅图像各个像素点进行相减取其绝对值,图像灰度化并二值化。

cvCvtColor( left, temp,CV_BGR2GRAY);
cvThreshold( temp, temp ,1, 255, CV_THRESH_BINARY );

temp

7.将得到的图像进行膨胀,然后进行腐蚀,最后进行平滑。

cvDilate(ctemp, ctemp, 0, 1);
cvErode(ctemp, ctemp, 0, 1);

result

cvSmooth(temp, temp,  CV_GAUSSIAN, 3, 0, 0,0);

8.查找图像轮廓。

cvFindContours( temp, storage, &contour, sizeof(CvContour),
                CV_RETR_TREE , CV_CHAIN_APPROX_SIMPLE  , cvPoint(0,0) );

9.求出各个轮廓的面积,判断是否面积符合要求,如果符合,求出你中心点并进行鼠标点击动作。

contour_area_tmp = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));

::SetCursorPos(rect.x+rect.width/2+m_rect.left+leftPos.x,rect.y+rect.height/2+m_rect.top+leftPos.y);
::mouse_event(MOUSEEVENTF_LEFTDOWN,520,310,NULL,NULL);  
::mouse_event(MOUSEEVENTF_LEFTUP,520,310,NULL,NULL);

10.释放资源。

 

上面粗体部份是这次主要进行的修改。

 

程序界面:

未命名

 

附上此外挂的使用说明:

1.使用时必须保证游戏画面不被其他窗口遮挡。
2.游戏有自动手动按钮,手动是弥补自动的不足,因此必须在按了自动按钮后无法完全找到才按手动,按手动按钮后可按刷新按钮去除闪烁点。

经过测试,总结如下:

1.只有少部分图像不能全部实习自动点击,但经过手动点击可弥补这个不足。

2.到目前为止未发现有不能找到不同点的游戏图像。

原创粉丝点击