最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年10月21日 15:54:11   作者:蛋片雞  
這篇文章主要介紹了Python如何實(shí)現(xiàn)手指指尖的檢測,并且可以在windows系統(tǒng)下通過判斷手指數(shù)目,來模擬鍵盤操作,感興趣的朋友可以了解下

  這是借鑒了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 cv2
import numpy as np
import copy
import math
import win32api
import win32con

# 參數(shù)
cap_region_x_begin = 0.5 # 起點(diǎn)/總寬度
cap_region_y_end = 0.8
threshold = 60 # 二值化閾值
blurValue = 41 # 高斯模糊參數(shù)
bgSubThreshold = 50
learningRate = 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 = i
        if 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 = True
                break
            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é)果:

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

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

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

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

原因: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)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實(shí)現(xiàn)讀取Linux系統(tǒng)的CPU以及內(nèi)存占用

    Python實(shí)現(xiàn)讀取Linux系統(tǒng)的CPU以及內(nèi)存占用

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)Linux系統(tǒng)的CPU以及內(nèi)存占用,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以收藏一下
    2023-05-05
  • python模塊和函數(shù)幫助文檔快速查看方法示例

    python模塊和函數(shù)幫助文檔快速查看方法示例

    這篇文章主要為大家介紹了python模塊和函數(shù)幫助文檔快速查看方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python實(shí)現(xiàn)RSA加密(解密)算法

    python實(shí)現(xiàn)RSA加密(解密)算法

    RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn),下面通過本文給大家介紹python實(shí)現(xiàn)RSA加密(解密)算法,需要的朋友參考下
    2016-02-02
  • Python字符串對齊和判斷方法匯總

    Python字符串對齊和判斷方法匯總

    本教程將詳細(xì)介紹Python中的字符串對齊方法以及字符串判斷方法,這些方法在文本處理、格式化輸出和字符串匹配中非常實(shí)用,無論你是Python初學(xué)者還是想要鞏固基礎(chǔ)知識的程序員,這篇教程都能幫助你全面理解這些操作,需要的朋友可以參考下
    2025-04-04
  • python實(shí)現(xiàn)打磚塊游戲

    python實(shí)現(xiàn)打磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • python實(shí)現(xiàn)簡單多人聊天室

    python實(shí)現(xiàn)簡單多人聊天室

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡單多人聊天室功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Python實(shí)現(xiàn)自動化處理每月考勤缺卡數(shù)據(jù)

    Python實(shí)現(xiàn)自動化處理每月考勤缺卡數(shù)據(jù)

    不管是上學(xué)還是上班都會統(tǒng)計(jì)考勤,有些學(xué)?;蚬緯γ吭氯笨ù螖?shù)過多(比如三次以上)的人員進(jìn)行處罰。本文提供了Python自動處理考勤和日志缺失的方法,需要的可以參考一下
    2022-06-06
  • python傅里葉變換FFT繪制頻譜圖

    python傅里葉變換FFT繪制頻譜圖

    這篇文章主要為大家詳細(xì)介紹了python傅里葉變換FFT繪制頻譜圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • python如何可視化經(jīng)緯度信息

    python如何可視化經(jīng)緯度信息

    在Python中處理經(jīng)緯度信息,首先通過篩選得到符合條件的停車點(diǎn),并去除重復(fù)數(shù)據(jù),利用這些數(shù)據(jù)點(diǎn)的索引值將原始數(shù)據(jù)進(jìn)行分段,并繪制地圖,處理重復(fù)數(shù)據(jù)時(shí)可以使用set()方法或列表生成式,最后,可以通過DataFrame的join方法合并具有相同索引值的數(shù)據(jù)
    2024-09-09
  • Tensorflow模型實(shí)現(xiàn)預(yù)測或識別單張圖片

    Tensorflow模型實(shí)現(xiàn)預(yù)測或識別單張圖片

    這篇文章主要為大家詳細(xì)介紹了Tensorflow模型實(shí)現(xiàn)預(yù)測或識別單張圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評論

康乐县| 房产| 乌拉特后旗| 喀喇沁旗| 沾化县| 万载县| 宜丰县| 通州市| 福州市| 石楼县| 华阴市| 平乐县| 太和县| 长岛县| 五台县| 三穗县| 松溪县| 裕民县| 贺州市| 永康市| 定西市| 正宁县| 宁安市| 乐山市| 左云县| 商水县| 泸定县| 大宁县| 大足县| 壶关县| 龙游县| 申扎县| 句容市| 柞水县| 寿阳县| 南陵县| 翁源县| 水富县| 奈曼旗| 武夷山市| 鹤山市|