OpenCV+Python3.5 簡(jiǎn)易手勢(shì)識(shí)別的實(shí)現(xiàn)
檢測(cè)剪刀石頭布三種手勢(shì),通過(guò)攝像頭輸入,方法如下:
- 選用合適顏色空間及閾值提取皮膚部分
- 使用濾波腐蝕膨脹等方法去噪
- 邊緣檢測(cè)
- 尋用合適方法分類(lèi)
OpenCV用攝像頭捕獲視頻
采用方法:調(diào)用OpenCV——cv2.VideoCapture()
def video_capture(): cap = cv2.VideoCapture(0) while True: # capture frame-by-frame ret, frame = cap.read() # our operation on the frame come here # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 可選擇灰度化 # display the resulting frame cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): # 按q鍵退出 break # when everything done , release the capture cap.release() cv2.destroyAllWindows()
效果如下
膚色識(shí)別——橢圓膚色檢測(cè)模型
參考下述博文
http://chabaoo.cn/article/202594.htm
代碼如下
def ellipse_detect(img): # 橢圓膚色檢測(cè)模型 skinCrCbHist = np.zeros((256, 256), dtype=np.uint8) cv2.ellipse(skinCrCbHist, (113, 155), (23, 15), 43, 0, 360, (255, 255, 255), -1) YCRCB = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB) (y, cr, cb) = cv2.split(YCRCB) skin = np.zeros(cr.shape, dtype=np.uint8) (x, y) = cr.shape for i in range(0, x): for j in range(0, y): CR = YCRCB[i, j, 1] CB = YCRCB[i, j, 2] if skinCrCbHist[CR, CB] > 0: skin[i, j] = 255 dst = cv2.bitwise_and(img, img, mask=skin) return dst
效果如下,可見(jiàn)與膚色相近的物體全被提取出來(lái),包括桌子。。。
識(shí)別時(shí)需尋找一無(wú)干擾環(huán)境
去噪——濾波、腐蝕和膨脹
參考下述博文
http://chabaoo.cn/article/202599.htm
采用方法:高斯濾波 cv2.GaussianBlur() + 膨脹 cv2.dilate(),代碼如下
# 膨脹 def dilate_demo(image): # 灰度化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 定義結(jié)構(gòu)元素的形狀和大小 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 膨脹操作 dst = cv2.dilate(binary, kernel) return dst # 腐蝕 def erode_demo(image): # 灰度化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 定義結(jié)構(gòu)元素的形狀和大小 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15)) # 腐蝕操作 dst = cv2.erode(binary, kernel) return dst # 濾波 def img_blur(image): # 腐蝕操作 # img_erode = erode_demo(image) # 膨脹操作 img_dilate = dilate_demo(image) # 均值濾波 # blur = cv2.blur(image, (5, 5)) # 高斯濾波 blur = cv2.GaussianBlur(img_dilate, (3, 3), 0) return blur
Canny邊緣檢測(cè)
參考OpenCV中文教程
https://www.kancloud.cn/aollo/aolloopencv/271603
代碼如下
# Canny邊緣檢測(cè)v def canny_detect(image): edges = cv2.Canny(image, 50, 200) return edges
識(shí)別——輪廓匹配
Tensorflow框架實(shí)在太難搭,搭了半天沒(méi)搭出來(lái),還一堆錯(cuò)誤。。。所以采用輪廓匹配 cv2.matchShapes() ,方案如下:
- 劃分出了一個(gè)手勢(shì)識(shí)別區(qū)域,可避免周?chē)h(huán)境的干擾,也可簡(jiǎn)化圖像處理過(guò)程
- 尋找輪廓時(shí)采用尋找矩形框架 cv2.boundingRect()的方法找到最大輪廓,即手勢(shì)的輪廓
- 將找到的輪廓直接與標(biāo)準(zhǔn)圖片進(jìn)行匹配,簡(jiǎn)化識(shí)別過(guò)程
但在匹配時(shí)發(fā)現(xiàn)“剪刀”的手勢(shì)常與“石頭”、“布”的手勢(shì)匹配到一起。。。所以另辟蹊徑,在匹配時(shí)加上了對(duì)于矩形框架面積的判斷,一般來(lái)說(shuō)有如下規(guī)律,石頭<剪刀<布,代碼如下
# 輪廓匹配 value = [0, 0, 0] value[0] = cv2.matchShapes(img_contour, img1, 1, 0.0) value[1] = cv2.matchShapes(img_contour, img2, 1, 0.0) value[2] = cv2.matchShapes(img_contour, img3, 1, 0.0) min_index = np.argmin(value) if min_index == 0: # 剪刀 print(text[int(min_index)], value) elif min_index == 1 and w*h < 25000: # 石頭 print(text[int(min_index)], value) elif min_index == 1 and w*h >= 25000: # 剪刀 print(text[0], value) elif min_index == 2 and w * h > 30000: # 布 print(text[int(min_index)], value) elif min_index == 2 and w * h <= 30000: # 剪刀 print(text[0], value)
程序會(huì)根據(jù)匹配值和面積大小來(lái)決定識(shí)別結(jié)果,例如,下述結(jié)果,1.179515828609219, 0.9604643714904955, 0.9896353720020925分別對(duì)應(yīng)剪刀、石頭、布的匹配值,越小說(shuō)明越吻合;結(jié)合最終識(shí)別情況來(lái)看,在三種手勢(shì)中,石頭的識(shí)別成功率最高,約98%;布其次,約88%;剪刀最低,約80%,而且結(jié)果易受環(huán)境亮度影響,環(huán)境過(guò)暗或過(guò)亮,有時(shí)候手勢(shì)輪廓都出不來(lái)。。??磥?lái)仍有待改進(jìn),還是得用機(jī)器學(xué)習(xí)的方法
石頭 [1.179515828609219, 0.9604643714904955, 0.9896353720020925]
程序效果如下,黃色矩形框?yàn)樽R(shí)別區(qū)域,gesture窗口為用于輪廓匹配的手勢(shì)圖
到此這篇關(guān)于OpenCV+Python3.5 簡(jiǎn)易手勢(shì)識(shí)別的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)OpenCV 手勢(shì)識(shí)別 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python+selenium定時(shí)爬取丁香園的新型冠狀病毒數(shù)據(jù)并制作出類(lèi)似的地圖(部署到云服務(wù)器)
這篇文章主要介紹了python+selenium定時(shí)爬取丁香園的新冠病毒每天的數(shù)據(jù)并制作出類(lèi)似的地圖(部署到云服務(wù)器),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Python聚類(lèi)算法之基本K均值實(shí)例詳解
這篇文章主要介紹了Python聚類(lèi)算法之基本K均值運(yùn)算技巧,結(jié)合實(shí)例形式較為詳細(xì)的分析了基本K均值的原理與相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11利用Anaconda創(chuàng)建虛擬環(huán)境的全過(guò)程
因?yàn)槎啻沃匦屡渲铆h(huán)境,這些命令每次都要用,每次都忘記,需要重新搜索,所以記錄這一過(guò)程,下面這篇文章主要給大家介紹了關(guān)于利用Anaconda創(chuàng)建虛擬環(huán)境的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07python中實(shí)現(xiàn)k-means聚類(lèi)算法詳解
這篇文章主要介紹了python中實(shí)現(xiàn)k-means聚類(lèi)算法詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11一文詳解如何在Python中實(shí)現(xiàn)switch語(yǔ)句
這篇文章主要給大家介紹了關(guān)于如何在Python中實(shí)現(xiàn)switch語(yǔ)句的相關(guān)資料,今天在學(xué)習(xí)python的過(guò)程中,發(fā)現(xiàn)python沒(méi)有switch這個(gè)語(yǔ)法,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-09-09Django的session中對(duì)于用戶驗(yàn)證的支持
這篇文章主要介紹了Django的session中對(duì)于用戶驗(yàn)證的支持,Django是百花齊放的Python框架中人氣最高的一個(gè),需要的朋友可以參考下2015-07-07解決安裝torch后,torch.cuda.is_available()結(jié)果為false的問(wèn)題
這篇文章主要介紹了解決安裝torch后,torch.cuda.is_available()結(jié)果為false的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12