用python玩微信跳一跳系列-棋子定位之顏色識別

前言
這是python玩跳一跳系列博文中一篇,主要內容是用顏色識別的方法來進行跳跳小人的定位。
顏色識別
通過觀察,我們可以發現,儘管背景和棋子在不停的變化,但跳跳小人的形狀和顏色基本保持不變,對於形狀,我們在上一篇博文中已經採用模板匹配的方法來進行識別定位,效果非常好。這一篇博文就來對顏色識別進行驗證。
基本思路
用HSV顏色空間對輸入的圖片進行處理,用某種指定的顏色進行蒙版mask處理進而得到二值化的黑白圖像,膨脹和腐蝕後去除噪點,對輪廓區域進行計算,畫出圓心和質心位置,並實現動態的跟蹤。
其基本的步驟如下:
設定需要的顏色閾值
讀入圖像
轉化爲HSV圖像
採用顏色的蒙版進行二值化處理得到黑白圖像
降噪和輪廓處理
繪出圓心
python3.6代碼

import cv2  
import numpy as np  
import time

lower_blue = np.array([115,75,75])    #設定藍色的閾值
upper_blue = np.array([130,255,125])

frame=cv2.imread('001.png')

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  #轉到HSV空間
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
cnts = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  
if len(cnts) > 0:  
    c = max(cnts, key = cv2.contourArea)   #找到面積最大的輪廓
    ((x, y), radius) = cv2.minEnclosingCircle(c)  #確定面積最大的輪廓的外接圓 

    center= (int(x),int(y))
    cv2.circle(frame, center, int(radius+10), (0, 0, 255), 3) #畫出圓心 
    cv2.circle(frame, center, 3, (0, 0, 255), -1)
    cv2.circle(hsv, center, int(radius+10), (255, 255, 255), 3) #畫出圓心 
    cv2.circle(hsv, center, 3, (0, 0, 255), -1)  
    cv2.circle(mask_blue, center, int(radius+10), (255, 255, 255), 3) #畫出圓心 
    cv2.circle(mask_blue, center, 3, (0, 0, 255), -1)  

cv2.imshow('frame',frame)
cv2.imshow('hsv',hsv)
cv2.imshow('mask',mask_blue)
if cv2.waitKey(0)==ord('q'):
    cv2.destroyAllWindows()

靜態圖片識別效果
這裏寫圖片描述
左邊是原始圖片,中間是蒙版後的二值圖,右邊就是HSV圖像,識別效果還是不錯的。
可以看到,目前選定的顏色基本可以將小人的輪廓全部篩選出來,其最大的部分恰好就在底盤,圓心位置正是我們需要的。
動態實時識別
我們給出動態圖,可以看一下動態實時識別的效果。
這裏寫圖片描述
評價
採用顏色來對跳跳小人的底盤位置進行識別和定位效果不錯,而且這種方法和手機的像素及屏幕大小無關,真正實現了各平臺通用。
預告
在下一篇博文中,我會對github上wechat-jump所採用的顏色遍歷方法進行驗證,敬請期待。

發佈了68 篇原創文章 · 獲贊 60 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章