基于Open cv + Python微信跳一跳輔助程序_第1頁
基于Open cv + Python微信跳一跳輔助程序_第2頁
基于Open cv + Python微信跳一跳輔助程序_第3頁
基于Open cv + Python微信跳一跳輔助程序_第4頁
基于Open cv + Python微信跳一跳輔助程序_第5頁
已閱讀5頁,還剩49頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于Opencv + Python 自動跳一跳輔助1/54玩微信跳一跳方式有:正常玩家:外星生物玩家:喵星人“神仙” 玩家:2/54目錄1.基本介紹2.原理與算法3.詳細模塊及代碼4.不足及改進3/5401基本介紹此項目中,我們用到工含有:1. OpenCV-python 3.3.02.Python(此項目版本為3.6)3.Arduino(包含相關套件)4/54請輸入標題OpenCV OpenCV是一個基于BSD許可(開源)發行跨平臺計算機視覺庫,能夠運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效由一系列 C 函數和少許 C+ 類組成,同時提供了Py

2、thon、JAVA、MATLAB等語言接口,實現了圖像處理和計算機視覺方面很多通用算法。 OpenCV用C+語言編寫,它主要接口也是C+語言,不過依然保留了大量C語言接口。該庫也有大量Python、Java 接口。這些語言API接口函數能夠經過在線文檔取得。如今也提供對于C#、Ch、Ruby支持。OpenCV5/54PythonPython Python 是一個面向對象解釋型計算機程序設計語言,由荷蘭人Guido van Rossum(吉多范羅蘇姆)于1989年創造,第一個公開發行版發行于1991年。 Python語法簡練清楚,特色之一是強制用空白符(white space)作為語句縮進。 P

3、ython含有豐富和強大庫。它常被昵稱為膠水語言,能夠把用其它語言制作各種模塊(尤其是C/C+)很輕松地聯結在一起。(如本項目標OpenCV )6/547/54ArduinoArduino Arduino是一款便捷靈活、方便上手開源電子原型平臺。由一個歐洲開發團體于冬季開發。 主要包含兩個主要部分:硬件部分是能夠用來做電路連接Arduino電路板;另外一個則是Arduino IDE,你計算機中程序開發環境。你只要在IDE中編寫程序代碼,將程序上傳到Arduino電路板后,程序便會告訴Arduino電路板要做些什么了。 基于Arduino項目,能夠只包含Arduino,也能夠包含Arduino和

4、其它一些在PC上運行軟件,他們之間進行通信 (比如 Flash, Processing, MaxMSP)來實現。8/54環境配置:windows下python+ opencv安裝1.python下載及安裝在python官網下載對應版本python:/downloads/windows/ 此項目中用是python3.6版本,下載好后直接點擊安裝,記得安裝時候確保勾選了pip和add python to path這兩項。python安裝成功后,可在命令提醒符窗口用 pip install packageNamea 安裝第三方模塊(前提是確定將Python添加到了系統變量)2.安裝numpy Num

5、Py系統是Python一個開源數值計算擴展。這種工具可用來存放和處理大型矩陣在命令提醒符窗口用pip install numpy,系統會自動下載numpy并進行安裝,可在窗口中查看下載進度。下列圖是已經安裝成功了。9/543.opencv-python下載及安裝在/gohlke/pythonlibs/#opencv下載對應版本opencv-python。左圖為各個版本opencv-python下載完成后,打開CMD命令行窗口,調整當前路徑之文件所在目錄下,然后用pip install opencv_python-3.4.1+contrib-cp36-none-win_amd64.whl(whl

6、 包含py文件壓縮包)進行安裝10/544.測試環境最終測試一下是否安裝成功,打開CMD,進入python,輸入import cv2,假如沒有提醒錯誤信息,則說明opencv配置成功11/541. RGB模型三維坐標:RGB:三原色 Red, Green, Blue原點到白色頂點中軸線是灰度線,r、g、b三分量相等,強度能夠由三分量向量表示。用RGB來了解色彩、深淺、明暗改變:色彩改變: 三個坐標軸RGB最大分量頂點與黃紫青YMC色頂點連線深淺改變:RGB頂點和CMY頂點到原點和白色頂點中軸線距離明暗改變:中軸線點位置,到原點,就偏暗,到白色頂點就偏亮12/542. HSV模型倒錐形模型:這個

7、模型就是按色彩、深淺、明暗來描述:色調H,用角度度量,取值范圍為0360,從紅色開始按逆時針方向計算,紅色為0,綠色為120,藍色為240飽和度S,飽和度高,顏色則深而艷。明度V,表示顏色明亮程度,對于光源色,明度值與發光體光亮度相關;對于物體色,此值和物體透射情況或反射反射情況相關。就是說,屏幕是亮一點還是暗一點。 13/5414/54因為后期考慮加裝攝像頭,實現“純”物理輔助,為預防光線,環境亮度等原因對攝像頭捕捉畫面影響,故本項目采取是 HSV模型 注意:對于HSV模型OpenCV中H 范圍為0-180而Photoshop中H范圍為0-360 所以棋子H范圍為 (255-15)/2, (

8、255+15)/215/5402Program = algorithm + data structure原理與算法16/54距離(distance)和 按壓時間(press_time)算法公式:按壓時間 = 距離 * 按壓系數此處距離為以像素為單位整個程序關鍵目標,便是準確記算出棋子到目標方塊中心點距離之后經過一個常量系數確定出所需要按壓時間。17/541、棋子與目標方塊識別,并計算像素距離2、給假定個時間距離系數如1.5,舵機轉動、延時這兩個待調參數 計算舵機實際執行時間3、PC經過串口將按壓時間發送給Arduino,從而控制舵機4、依據執行結果手動調整時間距離系數,和舵機轉動延時參數按壓系

9、數獲取邏輯:18/54流程圖棋子位置:二值化處理后,檢測輪廓,得到棋子重心坐標目標區域中心點:1.小白點模板匹配 2.假如匹配失敗,則選取邊緣提取方法PC將按壓時間發送給Arduino, Arduino控制舵機(或繼電器)實現一定時間模擬按壓19/5403模塊及詳細代碼在Python中調用numpy 和 OpenCVimport cv2 Import numpy20/54棋子位置確定: self_detect(img)1.切片操作2.RGB轉為HSV3.二值化處理4.檢測輪廓,矩形包圍輪廓5.找到棋子重心坐標并標識出來21/541.切片操作:縮小遍歷范圍 降低運算量同時降低誤識別幾率代碼:re

10、gion_upper=int(img.shape0*0.3) #img.shape是一個二維矩陣region_lower=int(img.shape0*0.7) #shape0表示圖像高度region=imgregion_upper:region_lower經過屢次嘗試,發覺其中裁剪系數0.3、0.7 截取出圖片剛好能包含所需信息22/54效果示意:23/542.RGB轉為HSVPython: cv2.cvtColor(src,code,dst,dstCn)hsv_img=cv2.cvtColor(region,cv2.COLOR_BGR2HSV)24/54輪廓(Contours),指是有相同

11、顏色或者密度,連接全部連續點一條曲線。3.輪廓檢測在輪廓檢測之前,首先要對圖片進行二值化或者Canny邊緣檢測。在OpenCV中,尋找物體是白色,而背景必須是黑色,所以圖片預處理時必須確保這一點。25/54先利用cv2.inRange函數設閾值,去除背景部分 函數很簡單,參數有三個 第一個參數:hsv指是原圖第二個參數:lower指是圖像中低于這個lower值,圖像值變為0第三個參數:upper指是圖像中高于這個upper值,圖像值變為0 而在lowerupper之間值變成255mask=cv2.inRange(hsv_img,lower,upper) # 依據閾值構建掩模代碼:color_l

12、ower=32(105,25,45)color_upper=32(135,125,130)color_mask = cv2.inRange(hsv_img, color_lower, color_upper)3.輪廓檢測26/54檢測棋子輪廓 參數第一個參數是尋找輪廓圖像;第二個參數表示輪廓檢索模式,有四種: cv2.RETR_EXTERNAL表示只檢測外輪廓 cv2.RETR_LIST檢測輪廓不建立等級關系 cv2.RETR_CCOMP建立兩個等級輪廓,上面一層為外邊界,里面一層為內孔邊界信息。假如內孔內還有一個連通物體,這個物體 邊界也在頂層。 cv2.RETR_TREE建立一個等級樹結構

13、輪廓。cv2.findContours(image,mode,method,contours,hierarchy,offset)返回值 一個是輪廓本身,還有一個是每條輪廓對應屬性。27/54檢測棋子輪廓關于輪廓迫近方法,有:cv2.CHAIN_APPROX_NONE:獲取每個輪廓每個元素,相鄰像素位置差不超出1,即連續點,但通常我們并不需要全部點cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向、垂直方向和對角線方向元素,保留該方向終點坐標,如矩形輪廓可用4個角點表示,這是一個慣用方法,比第一個方法能得出更少點cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_AP

14、PROX_TC89_KCOS:對應Tch-Chain鏈迫近算法 左:cv2.CHAIN_APPROX_NONE 右:cv2.CHAIN_APPROX_SIMPLE28/54max_contour = cv2.convexHull(max_contour)凸包與輪廓近似相同,但不一樣,即使有些情況下它們給出結果是一樣。函數 cv2.convexHull() 能夠用來檢測一個曲線是否含有凸性缺點,并能糾正缺點。普通來說,凸性曲線總是凸出來,最少是平。假如有地方凹進去了就被叫做凸性缺點。參考代碼為: hull=cv2.convexHull(points,hull,clockwise,returnPo

15、ints)points 我們要傳入輪廓 hull 輸出,通常不需要 clockwise 方向標志。假如設置為 True,輸出凸包是順時針方向。不然為逆時針方向。 returnPoints 默認值為 True。它會返回凸包上點坐標。假如設置為 False,就會返回與凸包點對應輪廓上點。29/54rect = cv2.boundingRect(max_contour)邊界矩形直邊界矩形 一個直矩形(就是沒有旋轉矩形)。它不會考慮對象是否旋轉。所以邊界矩形面積不是最小。能夠使用函數 cv2.boundingRect() 查找得到。函數返回值(x,y)為矩形左上角坐標,(w,h)是矩形寬和高。30/5

16、4獲取棋子重心位置并標識出來代碼(計算出重心坐標,并在途中標識出來)x, y, w, h = rectcenter_coord=(x+int(w/2),y+h+region_upper - 20)#棋子重心坐標0cv2.circle(img, center_coord, 5, (0,255,0), -1)其中cv2.circle(img, center_coord, 5, (0,255,0), -1) 為繪制一個圓形 img:你想要繪制圖形那幅圖像 center_cood:圓心坐標 linetype:線條類型, 8 連接,抗鋸齒等。默認情況是 8 連接 color:形狀顏色。以 RGB 為例,

17、需要傳入一個元組,比如: (0,255,0)代表藍色。對于灰度圖只需要傳入灰度值。 thickness:線條粗細。假如給一個閉合圖形設置為 -1,那么這個圖形就會被填充。默認值是 1.31/54 import cv2import numpy as npimg=cv2.imread(e:/hasage.jpg)#region_upper=int(img.shape0*0.3)#region_lower=int(img.shape0*0.7)region=img#region_upper:region_lowercv2.imshow(test,region )cv2.waitKey()hsv_im

18、g = cv2.cvtColor(region , cv2.COLOR_BGR2HSV)hsv_img =cv2.resize(hsv_img ,(450,800)cv2.imshow(RGB TO HSV,hsv_img )cv2.waitKey()color_lower=32(105,25,45)color_upper=32(135,125,130)color_mask = cv2.inRange(hsv_img, color_lower, color_upper)color_mask =cv2.resize(color_mask ,(450,800)cv2.imshow(color_ma

19、sk,color_mask )cv2.waitKey() scontours= cv2.findContours(color_mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)1if len(contours)0: max_contour = max(contours, key=cv2.contourArea) max_contour = cv2.convexHull(max_contour) rect = cv2.boundingRect(max_contour) x, y, w, h = rect cv2.rectangle(color_mask

20、 , (x, y), (x + w, y + h), (0, 255, 0), 5) img = cv2.resize(img, (450, 800) cv2.imshow(cicle, img) cv2.waitKey(0) center_coord=(x+int(w/2),y+h- 20) cv2.circle(img, center_coord, 5, (0,255,0), -1) img=cv2.resize(img,(450,800) cv2.imshow(cicle, img ) cv2.waitKey(0) print( center_coord)32/54目標位置 goal_d

21、etect(img)1.模板匹配(匹配小白點得到其坐標)2.假如匹配失敗,利用邊緣檢測結果尋找物塊上沿和下沿 從而求得目標方塊中心點坐標33/54Canny邊緣檢測思想:經過求導和求梯度確定全部長得像“邊緣”像素去掉最不像“邊緣”像素區分強邊緣(保留)和弱邊緣(待定)使用Canny邊緣檢測時對圖像預處理:使用高斯濾波器濾除噪聲(導數對噪聲非常敏感) 邊緣檢測:CV2.Canny34/54edge=cv2.Canny(image,threshold1,threshold2,edges,apertureSize,L2gradient)必要參數edges:輸出邊緣圖,需要和源圖片有一樣尺寸和類型im

22、age:待處理圖像thresh1和thresh2:分別為低閾值和高閾值,提議高低閾值之比為3:1到2:1之間可選參數aptertureSize:應用Sobel算子孔徑大小,有默認值3L2gradient:計算圖像梯度幅值標識,有默認值false邊緣檢測:CV2.Canny35/54注意:首先,因為Canny只能處理灰度圖,所以將讀取圖像轉成灰度圖。GRAY_img=cv2.cvtColor(region,cv2.COLOR_BRG2GRAY) 并用高斯平滑處理原圖像降噪。blurImg=cv2.GaussianBlur(img,(9,9),0)調用Canny函數,指定最大和最小閾值,其中ape

23、rtureSize默認為336/54模板匹配:是一項在一幅圖像中尋找與另一幅模板圖像最匹配(相同)部分技術。就是在整個圖像區域發覺與給定子圖像匹配那小塊區域。工作方法:在待檢測圖像上,模板圖像從左到右,從上向下逐一像素滑動,計算模板圖像與重合子圖像匹配度,匹配程度越大,二者相同可能性越大。對于 T 覆蓋在 I 上每個位置,把度量值保留到結果圖像矩陣 (R) 中,在 R 中每個位置 (x,y) 都包含匹配度量值。R 圖像中最黑(0 1)或最白(2 3 4 5)(匹配方法不一樣)位置代表最高匹配,紅色框住位置很可能是結果圖像矩陣中最大數值,所以這個區域 (以這個點為頂點,長寬和模板圖像一樣大小矩陣

24、) 被認為是匹配。模板匹配37/54匹配方法有:CV_TM_SQDIFF 平方差匹配法,最好匹配為0,值越大匹配越差CV_TM_SQDIFF_NORMED 歸一化平方差匹配法CV_TM_CCORR 相關匹配法,采取乘法操作,數值越大表明匹配越好CV_TM_CCORR_NORMED 歸一化相關匹配法 CV_TM_CCOEFF 相關系數匹配法,最好匹配為1,-1表示最差匹配CV_TM_CCOEFF_NORMED 歸一化相關系數匹配法前面兩種方法為越小值表示越匹配,后四種方法值越大越匹配。其實模板匹配使用和直方圖反向投影calcBackProject函數很像,只是直方圖反向投影對比是直方圖,而模板匹

25、配對比是圖像像素值,相比較而言,直方圖反向投影匹配魯棒性更加好。模板匹配38/541.切片操作(縱向和橫向)region_upper=int(img.shape0*0.3)region_lower=int(img.shape0*0.6)if body_position0切片:矩陣第一維第400行到最終,結果是還一個圖片,只是范圍是第400行開始#forrowin小圖片=一行一行讀.一行1080個點以下表示:#r0,g0,b0,r1,g1,b1,.,Rn,Gn,Bn#n=1079,就是說有1079個點#讀出來之后max(這一行點)#取最大點(Rn最大那個列表/數列)#得到Rk,Gk,Bk#第k行

26、maxRGB#np.nonzero()=非0元素坐標/索引;#np.nonzero()00#切片,!這個能夠判斷你圖是個RGB三通道圖片(或者通道3), 而非單通道灰度圖.#第一個0,取出含有非0全部行(只要rgb一個0即可),#第二個0從非0全部行中取出第1個非0行#總結:從400行開始找到第一個滿足條件行:這行有非0元素(只要有一個數字0就能夠).x=int(np.mean(np.nonzero(canny_imgy)#canny_imgy取出那個非0行#R0,G0,B0,R1,G1,B1,.R799,G799,B799#在這一行中全部非0元素坐標平均值.#int()向下取整.比如:int

27、(1.9)=1.41/54:# 先嘗試匹配截圖中中心原點,# 假如匹配值沒有到達0.95,則使用邊緣檢測匹配物塊上沿res1 = cv2.matchTemplate(img_rgb, temp_white_circle, cv2.TM_CCOEFF_NORMED)min_val1, max_val1, min_loc1, max_loc1 = cv2.minMaxLoc(res1)if max_val1 0.95: print(found white circle!) x_center, y_center = max_loc10 + w2 / 2, max_loc11 + h2 / 2else

28、: # 邊緣檢測 img_rgb = cv2.GaussianBlur(img_rgb, (5, 5), 0) canny_img = cv2.Canny(img_rgb, 1, 10) H, W = canny_img.shape img_rgb, x_center, y_center = get_center(canny_img)42/54中心點標注:center_coord =(x_center, y_center)cv2.circle(img, center_coord, 10, (255,0,0), -1) 其中cv2.circle(img, center_coord, 5, (25

29、5,0,0), -1) 為繪制一個圓形 img:你想要繪制圖形那幅圖像 center_cood:圓心坐標 linetype:線條類型, 8 連接,抗鋸齒等。默認情況是 8 連接 color:形狀顏色。以 RGB 為例,opencv中為BGR需要傳入一個元組,比如: (255,0,0)代表藍色。對于灰度圖只需要傳入灰度值。 thickness:線條粗細。假如給一個閉合圖形設置為 -1,那么這個圖形就會被填充。默認值是 1.43/54def find_board(img,piece_x,piece_y): board_x = 0 board_y = 0 result = 0 img2 = img.

30、copy() method = cv2.TM_CCOEFF_NORMED img:170, = 0 for i in special_board: template = cv2.imread(i, 0) template_w, template_h = template.shape:-1 res = cv2.matchTemplate(img, template, meth) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) if max_val 0.99 and (max_loc1 + template_h / 2) 0.9: # board_x = max_loc0 + 22 # board_y = max_loc1 + 22 # result = 1 # print(white_point_val: %f % max_val) # return board_x, board_y, result for i in range(piece_y - 120, piece_y + 10): for j in range(piece_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論