上次編寫的大家來找茬外掛雖然是實現了查找不同區域並把不同的區域顯示在屏幕上,但是得手動點擊,顯得很是麻煩,所以最近把程序又改了一改,實現了自動點擊功能。
程序的編寫流程:
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.到目前爲止未發現有不能找到不同點的遊戲圖像。