由于是使用Opencv完成手勢識別,所以首先利用顏色特征是對手的顏色進行提取,獲得HSV的最小值與最大值。
HSV的提取
HSV顏色空間閾值主要是靠Trackbar
調(diào)節(jié)閾值和cv2.inRange
來生成掩膜來提取。
這是我寫的HSV閾值獲取的代碼:
import cv2
import numpy as np
def MouseBack(value):
pass
cv2.namedWindow('frams')
cv2.resizeWindow('frams',[400,400])
Video=cv2.VideoCapture(0)
cv2.createTrackbar('minH','frams',0,179,MouseBack)
cv2.createTrackbar('maxH','frams',179,179,MouseBack)
cv2.createTrackbar('minS','frams',0,255,MouseBack)
cv2.createTrackbar('maxS','frams',255,255,MouseBack)
cv2.createTrackbar('minV','frams',0,255,MouseBack)
cv2.createTrackbar('maxV','frams',255,255,MouseBack)
while True:
res,img=Video.read()
hsvimg=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
minh=cv2.getTrackbarPos('minH','frams')
maxh=cv2.getTrackbarPos('maxH','frams')
mins=cv2.getTrackbarPos('minS','frams')
maxs=cv2.getTrackbarPos('maxS','frams')
minv=cv2.getTrackbarPos('minV','frams')
maxv=cv2.getTrackbarPos('maxV','frams')
lowHSV=np.array((minh,mins,minv),np.uint8)
highHSV=np.array((maxh,maxs,maxv),np.uint8)
newimg=cv2.inRange(hsvimg,lowHSV,highHSV)
newimg=cv2.bitwise_and(img,img,mask=newimg)
cv2.imshow('frams',newimg)
if cv2.waitKey(1) == ord('q'):
print(lowHSV)
print(highHSV)
break
Video.release()
cv2.destroyAllWindows()
使用方法:
運行代碼之后,從第一個依次調(diào)節(jié)滑塊,使畫面中只有手顯示出來。然后按Q退出界面打印閾值。
效果如下:
特征提取
準(zhǔn)備工作做完,就可以開始進行圖像處理了??梢韵葘螐垐D片進行處理。
- 首先是進行高斯濾波去噪
- 然后將圖像從BGR轉(zhuǎn)換到HSV
-
使用
cv2.inRange
獲得掩膜 -
進行形態(tài)學(xué)操作進一步提取特征
代碼如下:
#讀取圖片
img=cv2.imread(img_path)
#高斯濾波
Gaussimg=cv2.GaussianBlur(img,[5,5],0)
#HSV轉(zhuǎn)換
hsvimg=cv2.cvtColor(Gaussimg,cv2.COLOR_BGR2HSV)
#獲得HSV掩膜
maskimg=cv2.inRange(hsvimg,lowHSV,highHSV)
#開運算
kernel=np.ones([3,3],dtype=np.uint8)
closeimg=cv2.morphologyEx(maskimg,cv2.MORPH_CLOSE,kernel,iterations=3)
#腐蝕
kernel=np.ones([5,5],dtype=np.uint8)
dilateimg=cv2.morphologyEx(closeimg,cv2.MORPH_DILATE,kernel,iterations=3)
效果如下:
輪廓繪制
輪廓繪制首先需要尋找輪廓,然后對輪廓特征,比如面積周長進行進一步過濾,最后對輪廓進行逼近,對輪廓進行逼近有兩種。
- 輪廓近似
cv2.approxPolyDP
- 輪廓凸包
cv2.convexHull
#尋找輪廓
contours,num=cv2.findContours(newimg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
#獲得輪廓面積
area=cv2.contourArea(contour)
#獲得輪廓周長
lenth=cv2.arcLength(contour,True)
#閾值判斷
if area>20000 and lenth>1000:
epsilon = 0.02*cv2.arcLength(contour,True)
#輪廓近似
approx1 = cv2.approxPolyDP(contour,epsilon,True)
#輪廓凸包
approx2=cv2.convexHull(contour)
approx1=approx1.reshape(len(approx1),2)
approx2 = approx2.reshape(len(approx2), 2)
approx1=np.array(approx1,dtype=np.int32)
approx2 = np.array(approx2, dtype=np.int32)
cv2.polylines(faimg, [approx1], True, [255, 125, 100], 4, 16)
cv2.polylines(f, [approx2], True, [255, 125, 100], 4, 16)
效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-451735.html
完整代碼
import cv2
import numpy as np
highHSV=np.array([ 15 ,255,255])
lowHSV=np.array([ 0 ,50 ,50])
def img_hand(img):
# if img.shape[0]>1000 and img.shape[1]>1000:
# img=cv2.resize(img,None,fx=0.2,fy=0.2)
faimg=np.copy(img)
img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.GaussianBlur(img,[5,5],0)
img=cv2.inRange(img,lowHSV,highHSV)
kernel=np.ones([3,3],dtype=np.uint8)
img=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=1)
kernel=np.ones([5,5],dtype=np.uint8)
newimg=cv2.morphologyEx(img,cv2.MORPH_DILATE,kernel,iterations=1)
contours,num=cv2.findContours(newimg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
area=cv2.contourArea(contour)
lenth=cv2.arcLength(contour,True)
if area>20000 and lenth>1000:
epsilon = 0.02*cv2.arcLength(contour,True)
approx = cv2.approxPolyDP(contour,epsilon,True)
approx=approx.reshape(len(approx),2)
approx=np.array(approx,dtype=np.int32)
cv2.polylines(faimg, [approx], True, [255, 125, 100], 4, 16)
return faimg
video=cv2.VideoCapture(0)
while video.isOpened():
res,img=video.read()
if res== True:
newimg=img_hand(img)
cv2.imshow('frams',newimg)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
video.release()
由于不使用機器學(xué)習(xí)方法,缺點就是使用時手往前靠一點,頭往后靠一點,防止臉的膚色與手混淆,下一章講解如何識別不同手勢。
Python使用Opencv圖像處理方法完成手勢識別(二)文章來源地址http://www.zghlxwxcb.cn/news/detail-451735.html
到了這里,關(guān)于Python使用Opencv圖像處理方法完成手勢識別(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!