基于OpenCV与MFC的大家来找茬外挂[升级版]
2009-06-28 01:11
1046 查看
上次编写的大家来找茬外挂虽然是实现了查找不同区域并把不同的区域显示在屏幕上,但是得手动点击,显得很是麻烦,所以最近把程序又改了一改,实现了自动点击功能。
程序的编写流程:
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作为阈值进行二值化
5.从游戏区域左上角第一点开始向右开始探测,获取左右两幅图像(游戏图像)的左上角位置。
6.由这两个位置直接将左右两幅游戏图像截取出来,同时将这两幅图像各个像素点进行相减取其绝对值,图像灰度化并二值化。
cvCvtColor( left, temp,CV_BGR2GRAY);
cvThreshold( temp, temp ,1, 255, CV_THRESH_BINARY );
7.将得到的图像进行膨胀,然后进行腐蚀,最后进行平滑。
cvDilate(ctemp, ctemp, 0, 1);
cvErode(ctemp, ctemp, 0, 1);
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.到目前为止未发现有不能找到不同点的游戏图像。
程序的编写流程:
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作为阈值进行二值化
5.从游戏区域左上角第一点开始向右开始探测,获取左右两幅图像(游戏图像)的左上角位置。
6.由这两个位置直接将左右两幅游戏图像截取出来,同时将这两幅图像各个像素点进行相减取其绝对值,图像灰度化并二值化。
cvCvtColor( left, temp,CV_BGR2GRAY);
cvThreshold( temp, temp ,1, 255, CV_THRESH_BINARY );
7.将得到的图像进行膨胀,然后进行腐蚀,最后进行平滑。
cvDilate(ctemp, ctemp, 0, 1);
cvErode(ctemp, ctemp, 0, 1);
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.到目前为止未发现有不能找到不同点的游戏图像。
相关文章推荐
- 用VC++, OpenCV写大家来找茬外挂
- 基于VS2013 MFC的OPENCV3.1环境构建及测试
- 基于opencv的手写数字识别(MFC,HOG,SVM)
- 【MFC基础入门】基于Adaboost算法的车牌检测在OpenCV上的研究与实现
- 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)
- QQ游戏-大家来找茬 外挂
- 基于OpenCV的读取摄像头实现单个人脸验证MFC程序
- 基于MFC的OpenCV图像显示并标定ROI区域
- 大家来找茬游戏助手、外挂的实现
- 基于OpenCV的读取摄像头实现单个人脸验证MFC程序
- OpenCV:基于MFC的视频播放器和图片读取器
- 基于MFC和OpenCV的图像标注工具
- 基于opencv的手写数字识别(MFC,HOG,SVM)
- 基于OPenCV和MFC的读图程序
- 基于MFC的OpenCV简单视频播放器
- 基于MFC单文档下调用opencv库并将图片效果显示在单文档窗口
- 基于OPenCV和MFC的读图程序
- 【MFC】基于OpenCV的魔镜
- 基于MFC和OpenCV的图像处理小软件
- opencv [c++版] 学习笔记(2) 在MFC基于对话框界面上播放视频