亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

基于VS+Opencv2.4.10微信跳一跳輔助工具

2020-01-26 13:49:03
字體:
來源:轉載
供稿:網友

最近微信的跳一跳小程序可謂火了一把,不是因為它本身多好玩,而是有大部分的程序員們加入其中,利用各種領域方法,實現了微信跳一跳的外掛,分數輕松上千或上萬。之前也看了基于Python開源的代碼,GitHub上現在的star已經快超過1W了,簡直不敢想。趁著今天禮拜天,在實驗室中也簡單的實現了一下微信跳一跳的輔助工具,精度還不夠高,我跑了一下才到90,純屬娛樂好玩的,后期再繼續改進,主要是依賴C++來實現了一下。
環境: Win10+VS2012+Opencv2.4.10+ADB工具
環境的搭建請查閱相關資料!

主要思路:

通過adb圖像獲取部分大家可以查閱相關資料,代碼也很簡單:

adb shell screencap -p /sdcard/autojump.pngadb pull /sdcard/autojump.png

利用上面兩行代碼即可將手機當前的屏幕進行截圖并且上傳到工程文件路徑下。

首先就是在上傳的autojump.png圖片上進行模板匹配,匹配出小人,并計算小人的坐標;
然后就是通過Canny()函數進行圖像的邊緣檢測,這里使用的閾值為5,10基本可以檢測出所有邊緣信息;
然后根據一般下一個要跳的地點始終在小人的左半屏或又半屏部分這一先驗知識,來進行查找范圍的確定,進行行掃描,掃描到的第一個值為255的即返回當前坐標值;然后通過計算與小人坐標的距離即可得到下一步要跳躍的距離,(注:本代碼中在下一個坐標的縱坐標進行+50處理,由于本文中只利用了一個關鍵點進行測試的,這樣做是顯然不合理的,接下來可以再利用第二個關鍵點進行下一個跳躍目標中心點的計算),由于本人手機是1080*1920的所以再得到距離過后乘以一個跳躍系數1.35,(這里不同分辨率的手機系數是不一樣的),這樣就得到了跳躍按壓時間,從而通過system()命令進行調用ADB工具進行與手機通訊實現模擬人的點擊。本文僅僅是簡單的實現了一下看看效果,如果想跑高分還得進行代碼的優化與更改!其次因為每次按壓的地點肯定是不一樣的,而本文也采用簡單的同一位置按壓,這樣做很容易被騰訊反作弊給查出來的,所以這里可以添加一個隨機數從而可以簡單的避免位置重復!

代碼如下:

/* 時間:2018-1-7 地點:SHNU 功能:wechat簡單跳一跳C++代碼的實現,有待改進,僅供學習之用!歡迎大家提出新算法*/#include<opencv2/opencv.hpp>#include<iostream>#include<math.h>using namespace cv;using namespace std;//全局變量定義區Mat srcImage;Mat dstImage;Mat Character;//get_screenshot();獲取手機上的圖像void get_screenshot();//Canny_Dec();邊緣檢測void Canny_Dec(Mat& srcImage);//獲取Character坐標Point get_Character_Loc(Mat& srcImage,Mat& Tem_img);//獲取下一個要跳的點Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc);//計算距離int get_distance(Point& first_point,Point& next_point);//跳躍void jump(int&g_distance);int main(int argc,char** argv){ system("color 3F"); while (true) { get_screenshot(); srcImage = imread("autojump.png"); dstImage = srcImage.clone(); Character = imread("./Template/character.png"); //imshow("Character",Character); //cvtColor(srcImage,srcImage,CV_BGR2GRAY); Point next_p = get_Character_Loc(srcImage,Character); cout<<"next_p:"<<1111<<endl; Point get_next = get_next_img_Loc(srcImage,next_p); int g_distance = get_distance(next_p,get_next); jump(g_distance); //cout<<"get_next_img_Loc:"<<get_next<<endl; circle(dstImage,get_next,8,Scalar(0,221,2)); //imshow("test",dstImage); imwrite("Canny.png",dstImage); _sleep(1500); } return 0;}void get_screenshot(){ system("adb shell screencap -p /sdcard/autojump.png"); system("adb pull /sdcard/autojump.png");}Point get_Character_Loc(Mat& srcImage,Mat& Tem_img){ matchTemplate(srcImage,Tem_img,dstImage,CV_TM_SQDIFF); double minVal,maxVal; Point minLoc,maxLoc,matchLoc; minMaxLoc(dstImage,&minVal,&maxVal,&minLoc,&maxLoc,Mat()); matchLoc = minLoc; //matchLoc是最佳匹配的區域左上角點 rectangle(srcImage,Rect(matchLoc,Size(Character.cols,Character.rows)),Scalar(255,255,0),1,8,0); //Canny(srcImage,srcImage,1,10); putText(srcImage,"Wang",Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows),1,2,Scalar(0,0,255));//畫出Character小人的坐標 return Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows);}Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc){ cout<<"get_next_img_Loc"<<endl; cvtColor(srcImage,srcImage,CV_BGR2GRAY); Canny(srcImage,srcImage,5,10); imwrite("get_next_img_Loc.png",srcImage); //imshow("get",srcImage); cout<<"Character_Loc.x:"<<Character_Loc.x<<endl; if(Character_Loc.x < 540) {  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)  {   uchar* data = srcImage.ptr<uchar>(j);   for(int i = 1079;i > 540 ;i--)   {    if(data[i] == 255)    {     return Point(i,j);     //cout<<"Point:"<<Point(i,j)<<endl;    }   }  } } else {  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)  {   uchar* data = srcImage.ptr<uchar>(j);   for(int i = 0;i<540;i++)   {    if(data[i] == 255)     return Point(i,j);   }  } }}int get_distance(Point& first_point,Point& next_point){ int A = first_point.x - next_point.x; int B = first_point.y - (next_point.y+50); return int(pow(pow(A,2)+pow(B,2),0.5));}void jump(int&g_distance){ char AA[50]; int distance_ = g_distance * 1.35; sprintf(AA,"adb shell input swipe 320 410 320 410 %d",distance_); cout<<AA<<endl; system(AA);}

邊緣檢測圖片:

這里寫圖片描述

下一個關鍵點定位:

這里寫圖片描述

上圖中畫出的小圈圈,不太清晰,將就著看下!小菜水平有限,僅僅是基于好玩就弄了下!

結果:用開源的隨便跑跑幾百,自己的怎么跑,90 【累哭】

這里寫圖片描述

華麗的分割線――――――――――――――――

又來更新一下啦!

晚上不想看論文就想到了之前的跳一跳,經過一邊顯示命令窗口輸出和一邊顯示Canny()邊緣化處理終于找到了上次跑的分數低的原因啦!

主要原因如下所示:

這里寫圖片描述

如上所示,由于之前選取的Canny()中的閾值為1和10,這導致一旦要跳到的下一個目標物體的顏色和背景色很接近時就很容易使得邊緣的梯度小于10,因此就不會被認為是邊緣,從而導致上面的這種情況出現。索性今天就將閾值設為3和8,并在Canny()函數前面加上了一個高斯濾波器。如下:

GaussianBlur(srcImage,srcImage,Size(3,3),0);

還有就是上面的_sleep(1500)函數,這里如果閑時間比較久的話也是可以改為1000的,速度上有所提升。
同時加上按壓位置的隨機數,使得每次按壓點都是在(320,410)―(350,460)之間。代碼如下:

 int rand_x = int(320+rand()%50); //加上隨機數使得每次按壓都是在點(320,410)-(370,460)之間 int rand_y = int(410+rand()%50); sprintf(AA,"adb shell input swipe %d %d %d %d %d",rand_x,rand_y,rand_x,rand_y,distance_);

如下圖所示:

由上圖可知,每次按壓的位置都是在變的。

完整版代碼如下:

/* 時間:2018-1-7 地點:SHNU 功能:wechat簡單跳一跳C++代碼的實現,有待改進,僅供學習之用!歡迎大家提出新算法*/#include<opencv2/opencv.hpp>#include<iostream>#include<math.h>#include<stdlib.h>//rand()隨機數頭文件using namespace cv;using namespace std;//全局變量定義區Mat srcImage;Mat dstImage;Mat Character;static int i = 0;//get_screenshot();獲取手機上的圖像void get_screenshot();//Canny_Dec();邊緣檢測void Canny_Dec(Mat& srcImage);//獲取Character坐標Point get_Character_Loc(Mat& srcImage,Mat& Tem_img);//獲取下一個要跳的點Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc);//計算距離int get_distance(Point& first_point,Point& next_point);//跳躍void jump(int&g_distance);int main(int argc,char** argv){ system("color 3F"); while (true) { get_screenshot(); srcImage = imread("autojump.png"); dstImage = srcImage.clone(); Character = imread("./Template/character.png"); //imshow("Character",Character); //cvtColor(srcImage,srcImage,CV_BGR2GRAY); Point next_p = get_Character_Loc(srcImage,Character); //cout<<"next_p:"<<1111<<endl; Point get_next = get_next_img_Loc(srcImage,next_p); int g_distance = get_distance(next_p,get_next); jump(g_distance); //cout<<"get_next_img_Loc:"<<get_next<<endl; circle(dstImage,get_next,8,Scalar(0,221,2)); //imshow("test",dstImage); imwrite("Canny.png",dstImage); _sleep(1000); } return 0;}void get_screenshot(){ system("adb shell screencap -p /sdcard/autojump.png"); system("adb pull /sdcard/autojump.png");}Point get_Character_Loc(Mat& srcImage,Mat& Tem_img){ matchTemplate(srcImage,Tem_img,dstImage,CV_TM_SQDIFF); double minVal,maxVal; Point minLoc,maxLoc,matchLoc; minMaxLoc(dstImage,&minVal,&maxVal,&minLoc,&maxLoc,Mat()); matchLoc = minLoc; //matchLoc是最佳匹配的區域左上角點 cout<<"maxVal:"<<maxVal<<endl; rectangle(srcImage,Rect(matchLoc,Size(Character.cols,Character.rows)),Scalar(255,255,0),1,8,0); //Canny(srcImage,srcImage,1,10); putText(srcImage,"Wang",Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows),1,2,Scalar(0,0,255));//畫出Character小人的坐標 return Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows);}Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc){ cout<<"get_next_img_Loc"<<endl; cvtColor(srcImage,srcImage,CV_BGR2GRAY); GaussianBlur(srcImage,srcImage,Size(3,3),0); Canny(srcImage,srcImage,3,8); char AA[30]; sprintf(AA,"get_next_img_Loc_%d.png",i); cout<<AA<<endl; imwrite(AA,srcImage); i++; //imshow("get",srcImage); cout<<"Character_Loc.x:"<<Character_Loc.x<<endl; if(Character_Loc.x < 540) {  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)  {   uchar* data = srcImage.ptr<uchar>(j);   for(int i = 1079;i > 540 ;i--)   {        if(data[i] == 255)    {     return Point(i,j);     //cout<<"Point:"<<Point(i,j)<<endl;    }   }  } } else {  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)  {   uchar* data = srcImage.ptr<uchar>(j);   for(int i = 0;i<540;i++)   {    if(data[i] == 255)     return Point(i,j);   }  } } return Character_Loc;}int get_distance(Point& first_point,Point& next_point){ int A = first_point.x - next_point.x; int B = first_point.y - (next_point.y+50); return int(pow(pow(A,2)+pow(B,2),0.5));}void jump(int&g_distance){ char AA[50]; int distance_ = g_distance * 1.35; int rand_x = int(320+rand()%50); //加上隨機數使得每次按壓都是在點(320,410)-(370,460)之間 int rand_y = int(410+rand()%50); sprintf(AA,"adb shell input swipe %d %d %d %d %d",rand_x,rand_y,rand_x,rand_y,distance_); cout<<AA<<endl; system(AA);}

通過測試效果如下:輕松得榜首,到五百多時程序依然可以一直在運行,我覺得時間太長,所以就直接弄掛了。不過并不影響榜首的位置!上圖:

總結:主要本人剛好也是視覺圖像方向的,哈哈,就閑的無聊測試了一把,經過更改和測試。如果不遇到那種與背景色特別相近的,上榜首是沒問題的! 嗯,說了這么多,這個博客也就到此結束啦,有問題歡迎留言!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久影院免费观看| 精品国产一区二区三区四区在线观看| 日韩成人免费视频| 韩国一区二区电影| 欧美日韩xxx| 欧洲一区二区视频| 国产成人+综合亚洲+天堂| 国产精品视频在线播放| 揄拍成人国产精品视频| 中文字幕9999| 亚洲国产97在线精品一区| 国产精品网红直播| 亚洲精品自产拍| 精品国产乱码久久久久久虫虫漫画| 国产欧美亚洲视频| 久久亚洲影音av资源网| 日韩禁在线播放| 中文字幕欧美专区| 久久久久久国产三级电影| 色综合91久久精品中文字幕| 国产精品video| 国产精品美女免费看| 久久精品国产v日韩v亚洲| 国产精品女人网站| 91日韩在线播放| 日韩一中文字幕| 亚洲色图25p| 欧美性猛交xxxx黑人猛交| 成人亚洲综合色就1024| 亚洲的天堂在线中文字幕| 欧美三级欧美成人高清www| 成人午夜激情网| 国产91av在线| 在线观看国产精品淫| 一区二区欧美日韩视频| 欧美裸体xxxx极品少妇软件| 欧美日韩高清在线观看| 国产精品久久久久久久久久久久久久| 成人精品福利视频| 日韩免费在线电影| 日韩av一卡二卡| 亚洲性猛交xxxxwww| 国模视频一区二区| 精品亚洲一区二区三区| 亚洲xxx大片| 久久久噜噜噜久久久| 国产一区二区三区网站| 欧美午夜片欧美片在线观看| 久久久久在线观看| 国产精品你懂得| 亚洲欧美中文在线视频| 国产精品久久91| 亚洲全黄一级网站| 4388成人网| 亚洲欧美日韩精品久久奇米色影视| 国产做受69高潮| 国产精品午夜国产小视频| 欧美孕妇与黑人孕交| 亚洲女人天堂色在线7777| 亚洲精品中文字幕有码专区| 欧美性xxxx在线播放| 国产亚洲欧洲在线| 不卡毛片在线看| 精品视频—区二区三区免费| 亚洲第一网中文字幕| 97免费视频在线| 91系列在线播放| 国产成人97精品免费看片| 久久精品91久久久久久再现| 91高清免费视频| 欧美性生交大片免费| 一区二区在线免费视频| 国产区精品视频| 国产精品久久久久久久久久新婚| 日韩精品在线免费观看| 欧美国产日本高清在线| 日韩电影中文字幕一区| 一区二区三区www| 欧美插天视频在线播放| 亚洲自拍偷拍区| 懂色aⅴ精品一区二区三区蜜月| 777精品视频| 亚洲精品成人网| 日韩精品中文字幕在线观看| 中文字幕亚洲欧美日韩在线不卡| 在线丨暗呦小u女国产精品| 欧美亚洲成人xxx| 国产精品高清在线观看| 日韩在线中文字| 成人av色在线观看| 精品网站999www| 欧美日韩国产在线看| 精品久久久精品| 国产精品视频大全| 欧美激情2020午夜免费观看| 亚洲国产精品人人爽夜夜爽| 亚洲人在线观看| 久久久中文字幕| 国产成人精品日本亚洲专区61| 欧美中文字幕在线播放| 久久久精品在线| 2019中文字幕在线免费观看| 91国在线精品国内播放| 91精品国产色综合| 成人激情视频在线观看| 亚洲精品v欧美精品v日韩精品| 97色在线观看免费视频| 成人久久精品视频| 欧美成人精品在线播放| 亚洲国产欧美一区二区丝袜黑人| 欧美午夜精品在线| 国产裸体写真av一区二区| 中文字幕综合在线| 色悠久久久久综合先锋影音下载| 久久亚洲精品毛片| 欧美人成在线视频| 国产91网红主播在线观看| 日本一区二区三区四区视频| 欧美日韩国产色| 中文字幕亚洲欧美一区二区三区| 欧美日本高清一区| 久久精品视频在线观看| 亚洲成人网在线观看| 美女999久久久精品视频| 精品久久久久久久大神国产| 97精品在线观看| 亚洲sss综合天堂久久| 欧美一区二三区| 一区二区三区回区在观看免费视频| 红桃视频成人在线观看| 色一区av在线| 成年人精品视频| 欧美最猛黑人xxxx黑人猛叫黄| 欧美大片欧美激情性色a∨久久| 免费不卡欧美自拍视频| 国产精品视频久久| 欧美极品少妇xxxxx| 色综合伊人色综合网站| 国产精彩精品视频| 欧美黑人视频一区| 日本91av在线播放| 国产在线久久久| 色伦专区97中文字幕| 日韩亚洲成人av在线| 久久香蕉国产线看观看网| 日韩乱码在线视频| 夜夜狂射影院欧美极品| 欧美乱大交做爰xxxⅹ性3| 日韩成人高清在线| 日韩精品中文在线观看| 一个人看的www欧美| 国产亚洲欧洲高清一区| 一道本无吗dⅴd在线播放一区| 国产精品精品视频一区二区三区| 精品毛片三在线观看| 一区二区三区高清国产| zzjj国产精品一区二区| 亚洲国产美女精品久久久久∴| 精品日韩美女的视频高清| 97福利一区二区| 国产精品美女久久久免费| 欧美午夜精品久久久久久浪潮| 亚洲天堂成人在线视频| 国产亚洲激情视频在线|