日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python實現手勢識別

瀏覽:25日期:2022-07-07 15:33:56

這是借鑒了github上的一個源程序,參考源:https://github.com/lzane/Fingers-Detection-using-OpenCV-and-Python

自己在這個基礎上做了一點修改補充后,可以實現手指指尖的檢測,并且可以在windows系統下通過判斷手指數目,來模擬鍵盤操作。下面直接上源程序,并做了詳細注釋,方便理解。

環境:python3.6+opencv3.4.0

代碼如下:

import cv2import numpy as npimport copyimport mathimport win32apiimport win32con# 參數cap_region_x_begin = 0.5 # 起點/總寬度cap_region_y_end = 0.8threshold = 60 # 二值化閾值blurValue = 41 # 高斯模糊參數bgSubThreshold = 50learningRate = 0# 變量isBgCaptured = 0 # 布爾類型, 背景是否被捕獲triggerSwitch = False # 如果正確,鍵盤模擬器將工作def printThreshold(thr): print('! Changed threshold to ' + str(thr))def removeBG(frame): #移除背景 fgmask = bgModel.apply(frame, learningRate=learningRate) #計算前景掩膜 kernel = np.ones((3, 3), np.uint8) fgmask = cv2.erode(fgmask, kernel, iterations=1) #使用特定的結構元素來侵蝕圖像。 res = cv2.bitwise_and(frame, frame, mask=fgmask) #使用掩膜移除靜態背景 return res# 相機/攝像頭camera = cv2.VideoCapture(0) #打開電腦自帶攝像頭,如果參數是1會打開外接攝像頭camera.set(10, 200) #設置視頻屬性cv2.namedWindow(’trackbar’) #設置窗口名字cv2.resizeWindow('trackbar', 640, 200) #重新設置窗口尺寸cv2.createTrackbar(’threshold’, ’trackbar’, threshold, 100, printThreshold)#createTrackbar是Opencv中的API,其可在顯示圖像的窗口中快速創建一個滑動控件,用于手動調節閾值,具有非常直觀的效果。while camera.isOpened(): ret, frame = camera.read() threshold = cv2.getTrackbarPos(’threshold’, ’trackbar’) #返回滑動條上的位置的值(即實時更新閾值) # frame = cv2.cvtColor(frame,cv2.COLOR_RGB2YCrCb) frame = cv2.bilateralFilter(frame, 5, 50, 100) # 雙邊濾波 frame = cv2.flip(frame, 1) # 翻轉 0:沿X軸翻轉(垂直翻轉) 大于0:沿Y軸翻轉(水平翻轉) 小于0:先沿X軸翻轉,再沿Y軸翻轉,等價于旋轉180° cv2.rectangle(frame, (int(cap_region_x_begin * frame.shape[1]), 0),(frame.shape[1], int(cap_region_y_end * frame.shape[0])), (0, 0, 255), 2) #畫矩形框 frame.shape[0]表示frame的高度 frame.shape[1]表示frame的寬度 注:opencv的像素是BGR順序 cv2.imshow(’original’, frame) #經過雙邊濾波后的初始化窗口 #主要操作 if isBgCaptured == 1: # isBgCaptured == 1 表示已經捕獲背景 img = removeBG(frame) #移除背景 img = img[0:int(cap_region_y_end * frame.shape[0]),int(cap_region_x_begin * frame.shape[1]):frame.shape[1]] # 剪切右上角矩形框區域 cv2.imshow(’mask’, img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #將移除背景后的圖像轉換為灰度圖 blur = cv2.GaussianBlur(gray, (blurValue, blurValue), 0) #加高斯模糊 cv2.imshow(’blur’, blur) ret, thresh = cv2.threshold(blur, threshold, 255, cv2.THRESH_BINARY) #二值化處理 cv2.imshow(’binary’, thresh) # get the coutours thresh1 = copy.deepcopy(thresh) _, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #尋找輪廓 注:這里的’_’用作變量名稱,_表示一個變量被指定了名稱,但不打算使用。 length = len(contours) maxArea = -1 if length > 0: for i in range(length): # 找到最大的輪廓(根據面積)temp = contours[i]area = cv2.contourArea(temp) #計算輪廓區域面積if area > maxArea: maxArea = area ci = i res = contours[ci] #得出最大的輪廓區域 hull = cv2.convexHull(res) #得出點集(組成輪廓的點)的凸包 drawing = np.zeros(img.shape, np.uint8) cv2.drawContours(drawing, [res], 0, (0, 255, 0), 2) #畫出最大區域輪廓 cv2.drawContours(drawing, [hull], 0, (0, 0, 255), 3) #畫出凸包輪廓 moments = cv2.moments(res) # 求最大區域輪廓的各階矩 center = (int(moments[’m10’] / moments[’m00’]), int(moments[’m01’] / moments[’m00’])) cv2.circle(drawing, center, 8, (0,0,255), -1) #畫出重心 fingerRes = [] #尋找指尖 max = 0; count = 0; notice = 0; cnt = 0 for i in range(len(res)):temp = res[i]dist = (temp[0][0] -center[0])*(temp[0][0] -center[0]) + (temp[0][1] -center[1])*(temp[0][1] -center[1]) #計算重心到輪廓邊緣的距離if dist > max: max = dist notice = iif dist != max: count = count + 1 if count > 40: count = 0 max = 0 flag = False #布爾值 if center[1] < res[notice][0][1]: #低于手心的點不算 continue for j in range(len(fingerRes)): #離得太近的不算 if abs(res[notice][0][0]-fingerRes[j][0]) < 20 :flag = Truebreak if flag : continue fingerRes.append(res[notice][0]) cv2.circle(drawing, tuple(res[notice][0]), 8 , (255, 0, 0), -1) #畫出指尖 cv2.line(drawing, center, tuple(res[notice][0]), (255, 0, 0), 2) cnt = cnt + 1 cv2.imshow(’output’, drawing) print(cnt) if triggerSwitch is True:if cnt >= 3: print(cnt) # app(’System Events’).keystroke(’ ’) # simulate pressing blank space win32api.keybd_event(32, 0, 0, 0) # 空格鍵位碼是32 win32api.keybd_event(32, 0, win32con.KEYEVENTF_KEYUP, 0) # 釋放空格鍵 # 輸入的鍵盤值 k = cv2.waitKey(10) if k == 27: # 按下ESC退出 break elif k == ord(’b’): # 按下’b’會捕獲背景 bgModel = cv2.createBackgroundSubtractorMOG2(0, bgSubThreshold) #Opencv集成了BackgroundSubtractorMOG2用于動態目標檢測,用到的是基于自適應混合高斯背景建模的背景減除法。 isBgCaptured = 1 print(’!!!Background Captured!!!’) elif k == ord(’r’): # 按下’r’會重置背景 bgModel = None triggerSwitch = False isBgCaptured = 0 print(’!!!Reset BackGround!!!’) elif k == ord(’n’): triggerSwitch = True print(’!!!Trigger On!!!’)

運行程序操作:運行程序后,按下鍵盤的 b 鍵就可以捕獲背景了

運行結果:

Python實現手勢識別

注:模擬點擊空格鍵部分并未展示出來,有興趣的可以嘗試一下(按下n鍵就可以模擬鍵盤操作了)

補:該程序受光線影響其實較大,只有在單調背景小效果很好。

-------------------補充----------------------

后期再運行該程序的時候發現有一個錯誤,如下:

Python實現手勢識別

原因:opencv版本的原因,在opencv 4.0.0版本后,findContours的返回值只有contours, hierarchy兩個參數,不再有三個參數了!

解決辦法:

方法一:

更換opencv的版本

方法二:

將代碼 _,contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 改為 contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 即可!

以上就是Python實現手勢識別的詳細內容,更多關于Python 手勢識別的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
а√在线中文在线新版| 国精品一区二区三区| 国产三级精品三级在线观看国产| 日本成人中文字幕在线视频| 国产精品夜夜夜| 中国字幕a在线看韩国电影| 91精品国产成人观看| 99久久婷婷这里只有精品| 亚洲一级在线| 国产图片一区| 精品欧美一区二区三区在线观看| 国产偷自视频区视频一区二区| 日韩欧美三区| 福利片在线一区二区| 国产亚洲在线| 国产精品久久久久久久久久妞妞| 国产精品毛片一区二区在线看| 成人av二区| 国产精品亚洲人成在99www| 日韩大片免费观看| 三级一区在线视频先锋| 麻豆精品视频在线| 欧美午夜精彩| 欧美日一区二区三区在线观看国产免 | 午夜在线播放视频欧美| 久久国际精品| 欧美~级网站不卡| 国产福利资源一区| 亚洲欧美日韩高清在线| 国产精品白丝av嫩草影院| 精品日韩视频| 色综合视频一区二区三区日韩 | 国产精品成人一区二区不卡| 国产精品美女久久久| 精品伊人久久| 男人操女人的视频在线观看欧美| 精品国产一区二区三区性色av| 亚洲欧美日韩在线观看a三区| 国产精品3区| 久热re这里精品视频在线6| 久久99高清| 一区二区亚洲视频| 久久久久欧美精品| 国产乱人伦精品一区| 久久激情网站| 欧美国产专区| 亚洲精品亚洲人成在线观看| 色老板在线视频一区二区| 日韩高清一区| 红桃视频欧美| 国产66精品| 日韩1区2区3区| 亚洲国产日韩欧美在线| 精品国产18久久久久久二百| 日韩欧美中文在线观看| 亚洲精品一区二区妖精| 精品精品99| 国产欧美日韩亚洲一区二区三区| 午夜在线一区| bbw在线视频| 国产福利一区二区三区在线播放| 亚洲一区二区三区四区电影 | 国产精品一卡| 亚洲精品精选| 在线一区欧美| 欧美日韩黑人| 深夜视频一区二区| 精品美女在线视频| 久久精品 人人爱| 亚洲精品日韩久久| 国产亚洲精品自拍| 欧美日韩第一| av中文字幕在线观看第一页| 久久精品国产久精国产爱| 欧美亚洲自偷自偷| 日韩精品一区二区三区中文| 手机精品视频在线观看| 亚洲黑丝一区二区| 久久精品影视| 日韩久久一区二区三区| 福利在线免费视频| 成人台湾亚洲精品一区二区| 国产精品nxnn| 国产高清视频一区二区| 国产日韩视频在线| 欧美一区精品| 欧美亚洲免费| 日本欧美一区二区| 日本亚州欧洲精品不卡| 亚洲欧洲免费| 日韩在线观看一区二区三区| 亚洲精品九九| 日本v片在线高清不卡在线观看| 蜜桃久久久久久| 蜜桃传媒麻豆第一区在线观看| 亚洲视频二区| 日本精品一区二区三区在线观看视频| 日本不卡一区二区| 国产一区 二区| 国产美女亚洲精品7777| 国产精品分类| 日本精品黄色| 在线天堂中文资源最新版| 成人看片网站| 黄色成人精品网站| 日韩制服丝袜av| 日韩专区视频网站| 国产免费播放一区二区| 精品黄色一级片| 成人国产精品久久| 久久视频一区| 国产精品美女| 奇米狠狠一区二区三区| 国产精品夜夜夜| 97国产精品| 免费黄色成人| 久久先锋影音| 日韩av黄色在线| 精品国产欧美日韩一区二区三区| 色一区二区三区四区| 蜜桃精品在线| 免费在线欧美视频| 国产精品手机在线播放| 福利片在线一区二区| 激情综合自拍| 蜜桃视频在线观看一区| 国产伦精品一区二区三区视频| 日韩综合在线| 亚洲国产一区二区在线观看| 日本亚州欧洲精品不卡| 久久97视频| 欧美成人综合| 免费在线看一区| 国产欧美三级| 在线天堂中文资源最新版| 亚洲激情国产| 日韩av午夜在线观看| 国产91在线精品| 国产亚洲精品自拍| 久久国产精品色av免费看| 人人草在线视频| 视频一区二区中文字幕| 免费在线观看一区| 婷婷综合亚洲| 国产美女久久| 精品欧美激情在线观看| 国产欧美成人| 欧美日韩中文一区二区| 日本成人手机在线| 日韩精品专区| 亚洲一区av| 国产中文欧美日韩在线| 国产午夜精品一区二区三区欧美| 国产精品成人自拍| 99在线精品免费视频九九视| 国产欧美一区二区三区国产幕精品 | 麻豆mv在线观看| 午夜在线视频一区二区区别| 美女视频一区在线观看| 午夜久久黄色| 你懂的亚洲视频| 一区二区三区视频免费观看| 国产美女亚洲精品7777| 99re国产精品| 激情久久99| 亚洲18在线| 久久国产电影| 国产极品久久久久久久久波多结野 | 成人台湾亚洲精品一区二区| 天堂va蜜桃一区二区三区| 精品中文在线| 天堂av在线一区| 97精品一区| 国产探花一区在线观看| 亚洲欧美日韩高清在线| 精品九九在线| 日本成人一区二区| 黄色成人91| 91视频久久| 国产视频网站一区二区三区| 亚洲主播在线| 国产超碰精品| 国产精品伊人| 免费久久精品视频| 久久久精品日韩| 麻豆国产精品| 一区二区三区网站| 欧美色图国产精品| 精品国产精品久久一区免费式| 亚洲精品四区| 夜夜嗨网站十八久久| 群体交乱之放荡娇妻一区二区| 欧美日韩黄网站| 日韩精品一二三| 好看的av在线不卡观看| 日韩理论片av| 精品久久久久中文字幕小说| 69堂免费精品视频在线播放| 久久福利毛片| 伊人精品一区|