用OpenCV写的。exe在下面,把bin里的test.exe和nircmd.exe放在同一个目录应该就可以了。。我的屏幕是1280*800。屏幕比我大的问题应该都不大。。
没写矩形判断(那样似乎太假了)。。用的时候点小窗口里白色区域5次就可以了(不想点小窗口自己点游戏里对应位置也成,显得更真实点~。~?)。5次以上是补点。右键点击白色区域是立即反应(看上去不像挂~。~)每轮结束后,下一轮出现倒计时的时候就可以把小窗口关掉了。。
http://note.sdo.com/u/428574418#/n/pyUri~jvR_iMLX024000SC
#include <stdlib.h>
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <windows.h>
#include <iostream>
#define MouseMaxNum 5
int mouse_click_num = 0;
int mouse_click_pos[6][2];
using namespace std;
void sim_mouse_click();
void on_mouse( int event, int x, int y, int flags, void* param );
void sim_mouse_click()
{
POINT oldPoint;
GetCursorPos(&oldPoint);
if(mouse_click_num < 6)
{
Sleep(100);
SetCursorPos(-233+516+mouse_click_pos[0][0],0+192+mouse_click_pos[0][1]);
Sleep(100);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,NULL);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,NULL);
Sleep(150);
for(int i = 1; i < 5; i++)
{
Sleep(50);
SetCursorPos(-233+516+mouse_click_pos[i][0],0+192+mouse_click_pos[i][1]);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,NULL);
Sleep(100);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,NULL);
Sleep(200);
//cout << mouse_click_pos[i][0] << mouse_click_pos[i][1] << endl;
}
}
else
{
if(mouse_click_pos[5][0] < 10000 && mouse_click_pos[5][1] < 10000)
{
Sleep(50);
SetCursorPos(-233+516+mouse_click_pos[5][0],0+192+mouse_click_pos[5][1]);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,NULL);
Sleep(100);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,NULL);
Sleep(50);
//cout << mouse_click_pos[5][0] << mouse_click_pos[5][1] << endl;
}
}
SetCursorPos(oldPoint.x, oldPoint.y);
}
void on_mouse( int event, int x, int y, int flags, void* param )
{
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
{
//cout << mouse_click_num << endl;
//cout<<"("<<x<<","<<y<<")"<< endl;
if(mouse_click_num < 5)
{
mouse_click_pos[mouse_click_num%5][0] = x;
mouse_click_pos[mouse_click_num%5][1] = y;
}
else
{
mouse_click_pos[5][0] = x;
mouse_click_pos[5][1] = y;
}
mouse_click_num++;
if(mouse_click_num > 4)
sim_mouse_click();
break;
}
case CV_EVENT_RBUTTONDOWN:
{
POINT oldPoint;
GetCursorPos(&oldPoint);
Sleep(100);
SetCursorPos(-233+516+x,0+192+y);
Sleep(100);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,NULL);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,NULL);
Sleep(150);
SetCursorPos(oldPoint.x, oldPoint.y);
break;
}
break;
}
}
int main()
{
while(1)
{
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event('M', 0, 0 ,0);
keybd_event('M', 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
HWND prog = FindWindow(NULL, "大家来找茬\0");
Sleep(100);
ShowWindow(prog, SW_RESTORE);
Sleep(100);
SetWindowPos(prog, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
Sleep(200);
//HWND prog = GetDesktopWindow();
RECT pos;
GetWindowRect( prog, & pos );
system("nircmd.exe cmdwait 100 savescreenshot shot.png");
IplImage* img1, *img2, *img3;
IplImage* greyImage = NULL;
IplImage* greyImage1 = NULL;
img1=cvLoadImage("shot.png");
img2=cvLoadImage("shot.png");
CvRect rect1 = cvRect(pos.left+7, pos.top+192, 488, 443);
CvRect rect2 = cvRect(pos.left+516, pos.top+192, 488, 443);
cvSetImageROI(img1, rect1);
cvSetImageROI(img2, rect2);
if(!img1 || !img2){
printf("Could not load image file\n");
exit(0);
}
img3 = cvCreateImage(cvGetSize(img1),img1->depth,img1->nChannels);
cvAbsDiff(img1,img2,img3);
greyImage = cvCreateImage(cvGetSize(img3),8,1);
cvCvtColor(img3, greyImage, CV_BGR2GRAY);
greyImage1 = cvCreateImage(cvGetSize(img1),8,1);
cvCvtColor(img1, greyImage1, CV_BGR2GRAY);
int height = greyImage->height;
int width = greyImage->width;
int step = greyImage->widthStep;
int channels = greyImage->nChannels;
uchar *data = (uchar *)greyImage->imageData;
uchar *data1 = (uchar *)greyImage1->imageData;
for(int i=1;i<height;i++)
for(int j=3;j<width;j++)
for(int k=0;k<channels;k++)
if(data[i*step+j*channels+k] > 0)
{
data[i*step+j*channels+k] = 255;
//cout << i << " " << j << endl;
//SetCursorPos(pos.left+5+j, pos.top+190+i);
//mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );// 按下
//Sleep(100);
//mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );//弹起
//Sleep(100);
//mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );// 按下
//mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );//弹起
}
else
{
data[i*step+j*channels+k] = data1[i*step+j*channels+k]/2;
}
//cvNamedWindow("img1", CV_WINDOW_AUTOSIZE);
//cvNamedWindow("img2", CV_WINDOW_AUTOSIZE);
//cvSmooth(greyImage, greyImage, CV_MEDIAN, 3, 0, 0, 0);
//cvErode(greyImage, greyImage, NULL, 30);
//CvMemStorage* storage = cvCreateMemStorage(0);
//CvSeq* contour = 0;
//cvCanny(greyImage, greyImage, 1, 3, 3);
//cout << cvFindContours( greyImage, storage, &contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_CODE, cvPoint(0, 0));
cvNamedWindow("img3", CV_WINDOW_AUTOSIZE);
//cvShowImage("img1", img1 );
//cvShowImage("img2", img2 );
cvShowImage("img3", greyImage );
ShowWindow(prog, SW_RESTORE);
Sleep(100);
SetWindowPos(prog, HWND_TOP, -233, 0, 0, 0, SWP_NOSIZE);
HWND progimg3 = FindWindow(NULL, "img3\0");
Sleep(100);
ShowWindow(progimg3, SW_RESTORE);
Sleep(100);
SetWindowPos(progimg3, HWND_TOP, 795, 167, 0, 0, SWP_NOSIZE);
mouse_click_num = 0;
cvSetMouseCallback("img3", on_mouse, greyImage);
cvWaitKey(0);
cvReleaseImage(&img1);
cvReleaseImage(&img2);
cvReleaseImage(&img3);
cvReleaseImage(&greyImage);
cvReleaseImage(&greyImage1);
//cvClearMemStorage(storage);
}
return 0;
}

==============================
有人问OpenCV+Codeblock on Windows是怎么配置的。
我是参考这篇。
http://opencv.willowgarage.com/wiki/CodeBlocks
OpenCV版本是 OpenCV-2.3.1-win-superpack.exe 2011-08-17 131.1 MB
解压后,在CodeBlock里新建project,build options里3个地方添东西,如下(相对路径绝对路径都可以,看你opencv装在哪个地方了)
search directories的compiler里,注意那个\opencv\build\include一定要添,和上面教程里的不大一样,不添找不到.h头文件

我是32位的机子。lib的话因为在win下,所以用vc10的lib

linker里把lib下的*.lib都选上

最后,在系统path里(我的电脑右键属性里改)添上bin的地址,里面是dll文件,否则可以编译,但是运行时提示找不到dll。

当然,也可以像 http://opencv.willowgarage.com/wiki/CodeBlocks 里第一种方法,用pkg-config和CMake,但是CMake生成dll要很久。。不是很建议。
===========================
附一个比较简单的opencv测试sample,使用的时候在目录里放张testp.jpg的图就行
#include <iostream>
#include "cv.h"
#include "highgui.h"
using namespace std;
int main()
{
IplImage* img = cvLoadImage( "testp.jpg" );
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
cvShowImage("Example1", img);
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( "Example1" );
return 0;
}