python手势识别_Python|使用opencv进行简单的手势检测
簡(jiǎn)單的手勢(shì)識(shí)別,基本思路是基于皮膚檢測(cè),皮膚的顏色在HSV顏色空間下與周圍環(huán)境的區(qū)分度更高,從RGB轉(zhuǎn)換到HSV顏色空間下針對(duì)皮膚顏色進(jìn)行二值化,得到mask:
defHSVBin(img):
hsv=cv2.cvtColor(img,cv2.COLOR_RGB2HSV)
lower_skin= np.array([100,50,0])
upper_skin= np.array([125,255,255])
mask=cv2.inRange(hsv,lower_skin,upper_skin)return mask
其中:
cvtColor用于顏色空間轉(zhuǎn)換。
inRange中,lower指圖像中低于這個(gè)值,圖像值會(huì)變成0;upper指圖像中高于這個(gè)值,圖像值會(huì)變成0,而在這之間的值變?yōu)?55。
然后通過(guò)腐蝕與膨脹等形態(tài)學(xué)變化去除一些噪點(diǎn),得到更完整的白色(皮膚)色塊,最后找出色塊的輪廓,并通過(guò)色塊大小排除一些面積較小的噪點(diǎn):
defgetContours(img):
kernel= np.ones((5,5),np.uint8)
closed=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
closed=cv2.morphologyEx(closed,cv2.MORPH_CLOSE,kernel)
_,contours,h=cv2.findContours(closed,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
vaildContours=[]for cont incontours:if cv2.contourArea(cont)>9000:
vaildContours.append(cv2.convexHull(cont))return vaildContours
膨脹:dilate,進(jìn)行膨脹操作時(shí),將內(nèi)核 B劃過(guò)圖像,將內(nèi)核B覆蓋區(qū)域的最大像素值提取,并代替錨點(diǎn)位置的像素,這一最大化操作會(huì)導(dǎo)致圖像中的亮區(qū)開始“擴(kuò)展”。
腐蝕:erode,將最小像素值提取原始圖片里的一個(gè)像素(1或者0)只有在核下的所有像素都是1的時(shí)候才被認(rèn)為是1.否則它就被腐蝕掉了(變成0)。根據(jù)核的大小來(lái)決定在邊界附近的多少像素會(huì)被丟棄掉,所以前景物體的厚度或大小會(huì)縮小,或者說(shuō)白色區(qū)域會(huì)減小。這個(gè)在移除小的白色噪點(diǎn)時(shí)很有用。
ones(shape[,dtype,order]) 依據(jù)一個(gè)給定的形狀和類型返回一個(gè)新的元素全部為1的數(shù)組。
data type :uint8 -->range:0~255,一張圖片的數(shù)據(jù)類型默認(rèn)為unit8
開:腐蝕之后再膨脹的另一個(gè)名字。我們使用函數(shù)cv2.morphologyEx()。
閉:膨脹之后再腐蝕,在用來(lái)關(guān)閉前景對(duì)象里的小洞或小黑點(diǎn)很有用。
輪廓檢測(cè) cv2.findContours,接收參數(shù)為二值圖。
defmain():
cap=cv2.VideoCapture(0)while(cap.isOpened()):
ret,img=cap.read()
skinMask=HSVBin(img)
contours=getContours(skinMask)
cv2.drawContours(img,contours,-1,(0,255,0),2)
cv2.imshow('capture',img)
k= cv2.waitKey(10)if k == 27:break
cv2.waitKey()--waitKey()函數(shù)的功能是不斷刷新圖像,頻率時(shí)間為delay,單位為ms。返回值為當(dāng)前鍵盤按鍵值。
完整代碼如下:
importcv2importnumpy as npdefmain():
cap=cv2.VideoCapture(0)while(cap.isOpened()):
ret,img=cap.read()
skinMask=HSVBin(img)
contours=getContours(skinMask)
cv2.drawContours(img,contours,-1,(0,255,0),2)
cv2.imshow('capture',img)
k= cv2.waitKey(10)if k == 27:break
defgetContours(img):
kernel= np.ones((5,5),np.uint8)
closed=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
closed=cv2.morphologyEx(closed,cv2.MORPH_CLOSE,kernel)
_,contours,h=cv2.findContours(closed,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
vaildContours=[]for cont incontours:if cv2.contourArea(cont)>9000:#x,y,w,h = cv2.boundingRect(cont)
#if h/w >0.75:
#filter face failed
vaildContours.append(cv2.convexHull(cont))#rect = cv2.minAreaRect(cont)
#box = cv2.cv.BoxPoint(rect)
#vaildContours.append(np.int0(box))
returnvaildContoursdefHSVBin(img):
hsv=cv2.cvtColor(img,cv2.COLOR_RGB2HSV)
lower_skin= np.array([100,50,0])
upper_skin= np.array([125,255,255])
mask=cv2.inRange(hsv,lower_skin,upper_skin)#res = cv2.bitwise_and(img,img,mask=mask)
returnmaskif __name__ =='__main__':
main()
效果:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python手势识别_Python|使用opencv进行简单的手势检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 爬虫库 beautiful
- 下一篇: 人工智能选go还是python_深圳人工