电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Python實(shí)現(xiàn)手勢識別

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

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

自己在這個(gè)基礎(chǔ)上做了一點(diǎn)修改補(bǔ)充后,可以實(shí)現(xiàn)手指指尖的檢測,并且可以在windows系統(tǒng)下通過判斷手指數(shù)目,來模擬鍵盤操作。下面直接上源程序,并做了詳細(xì)注釋,方便理解。

環(huán)境:python3.6+opencv3.4.0

代碼如下:

import cv2import numpy as npimport copyimport mathimport win32apiimport win32con# 參數(shù)cap_region_x_begin = 0.5 # 起點(diǎn)/總寬度cap_region_y_end = 0.8threshold = 60 # 二值化閾值blurValue = 41 # 高斯模糊參數(shù)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) #計(jì)算前景掩膜 kernel = np.ones((3, 3), np.uint8) fgmask = cv2.erode(fgmask, kernel, iterations=1) #使用特定的結(jié)構(gòu)元素來侵蝕圖像。 res = cv2.bitwise_and(frame, frame, mask=fgmask) #使用掩膜移除靜態(tài)背景 return res# 相機(jī)/攝像頭camera = cv2.VideoCapture(0) #打開電腦自帶攝像頭,如果參數(shù)是1會打開外接攝像頭camera.set(10, 200) #設(shè)置視頻屬性cv2.namedWindow(’trackbar’) #設(shè)置窗口名字cv2.resizeWindow('trackbar', 640, 200) #重新設(shè)置窗口尺寸cv2.createTrackbar(’threshold’, ’trackbar’, threshold, 100, printThreshold)#createTrackbar是Opencv中的API,其可在顯示圖像的窗口中快速創(chuàng)建一個(gè)滑動控件,用于手動調(diào)節(jié)閾值,具有非常直觀的效果。while camera.isOpened(): ret, frame = camera.read() threshold = cv2.getTrackbarPos(’threshold’, ’trackbar’) #返回滑動條上的位置的值(即實(shí)時(shí)更新閾值) # frame = cv2.cvtColor(frame,cv2.COLOR_RGB2YCrCb) frame = cv2.bilateralFilter(frame, 5, 50, 100) # 雙邊濾波 frame = cv2.flip(frame, 1) # 翻轉(zhuǎn) 0:沿X軸翻轉(zhuǎn)(垂直翻轉(zhuǎn)) 大于0:沿Y軸翻轉(zhuǎn)(水平翻轉(zhuǎn)) 小于0:先沿X軸翻轉(zhuǎn),再沿Y軸翻轉(zhuǎn),等價(jià)于旋轉(zhuǎn)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) #經(jīng)過雙邊濾波后的初始化窗口 #主要操作 if isBgCaptured == 1: # isBgCaptured == 1 表示已經(jīng)捕獲背景 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]] # 剪切右上角矩形框區(qū)域 cv2.imshow(’mask’, img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #將移除背景后的圖像轉(zhuǎn)換為灰度圖 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) #尋找輪廓 注:這里的’_’用作變量名稱,_表示一個(gè)變量被指定了名稱,但不打算使用。 length = len(contours) maxArea = -1 if length > 0: for i in range(length): # 找到最大的輪廓(根據(jù)面積)temp = contours[i]area = cv2.contourArea(temp) #計(jì)算輪廓區(qū)域面積if area > maxArea: maxArea = area ci = i res = contours[ci] #得出最大的輪廓區(qū)域 hull = cv2.convexHull(res) #得出點(diǎn)集(組成輪廓的點(diǎn))的凸包 drawing = np.zeros(img.shape, np.uint8) cv2.drawContours(drawing, [res], 0, (0, 255, 0), 2) #畫出最大區(qū)域輪廓 cv2.drawContours(drawing, [hull], 0, (0, 0, 255), 3) #畫出凸包輪廓 moments = cv2.moments(res) # 求最大區(qū)域輪廓的各階矩 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]) #計(jì)算重心到輪廓邊緣的距離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]: #低于手心的點(diǎn)不算 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用于動態(tài)目標(biāo)檢測,用到的是基于自適應(yīng)混合高斯背景建模的背景減除法。 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!!!’)

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

運(yùn)行結(jié)果:

Python實(shí)現(xiàn)手勢識別

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

補(bǔ):該程序受光線影響其實(shí)較大,只有在單調(diào)背景小效果很好。

-------------------補(bǔ)充----------------------

后期再運(yùn)行該程序的時(shí)候發(fā)現(xiàn)有一個(gè)錯(cuò)誤,如下:

Python實(shí)現(xiàn)手勢識別

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

解決辦法:

方法一:

更換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實(shí)現(xiàn)手勢識別的詳細(xì)內(nèi)容,更多關(guān)于Python 手勢識別的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 深圳市东信高科自动化设备有限公司 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 深圳市源和塑胶电子有限公司-首页 | 四川成人高考_四川成考报名网 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 电池高低温试验箱-气态冲击箱-双层电池防爆箱|简户百科 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 翰香原枣子坊加盟费多少钱-正宗枣核糕配方培训利润高飘香 | 农产品溯源系统_农产品质量安全追溯系统_溯源系统 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | MVR蒸发器厂家-多效蒸发器-工业废水蒸发器厂家-康景辉集团官网 | 纳米二氧化硅,白炭黑,阴离子乳化剂-臻丽拾科技| 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 微动开关厂家-东莞市德沃电子科技有限公司 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 字典-新华字典-在线字典查字-字典趣|