文章目錄
- 一、 效果(版本2的效果)
- 二、全部原始碼
- 版本1:未封裝代碼
- 版本2:封裝好的代碼
- 三、 開發工具
- 四、 遇到的問題記錄
- 第一個問題: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
- 解決方案:(可能只適用于我,不妨可以試試)
- 第二個問題:使用pip指令,下載opencv-python,numpy等報錯
- 解決方案:使用國內鏡像安裝
一、 效果(版本2的效果)

下面是我的關于Opencv的手勢識別代碼模型,該原始碼來自于B站Opencv的大神教程
二、全部原始碼
版本1:未封裝代碼
這個代碼可以復制后直接運行,看出效果的,
#!/usr/bin/python3.7
# coding=utf-8
import cv2
import mediapipe as mp
import time
# 匯入opencv模塊
# 捕捉幀,筆記本攝像頭設定為0即可
""" VideoCapture第一個引數就是攝像頭編號"""
capture =cv2.VideoCapture(0,cv2.CAP_DSHOW)
# 初始化(模型使用之前)
mpHands =mp.solutions.hands
hands=mpHands.Hands()
mpDraw=mp.solutions.drawing_utils
pTime=0
cTime=0
# 回圈顯示幀
while True :
success, img = capture.read()
imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
results=hands.process(imgRGB)
"""在顯示圖片之前,我們需要對影像進行一些處理"""
# 下面這個函式,當手放入攝像頭范圍內,就會回傳相應的Landmark值,否則回傳的是None
#print(results.multi_hand_landmarks)
# 輸出手的每個坐標(一只手幾十個點)
if results.multi_hand_landmarks:
print("讀取成功!")
for handLms in results.multi_hand_landmarks:
for id, lm in enumerate(handLms.landmark):
print(id,lm)
mpDraw.draw_landmarks(img, handLms,mpHands.HAND_CONNECTIONS) # 第三個引數的意思是,讓手中的節點連接,
cv2.imshow('Carmer', img)
if cv2.waitKey(1) == ord('q'): # 按Q退出
break
版本2:封裝好的代碼
這個代碼是封裝好的,都后面如果需要就是直接參考,不過也可以直接運行這個程式,也同樣能出結果,
import cv2
import mediapipe as mp
import time
class handDetector():
def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):
self.mode = mode
self.maxHands = maxHands
self.detectionCon = detectionCon
self.trackCon = trackCon
self.mpHands = mp.solutions.hands
self.hands = self.mpHands.Hands(self.mode, self.maxHands,
self.detectionCon, self.trackCon)
self.mpDraw = mp.solutions.drawing_utils
def findHands(self, img, draw=True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.hands.process(imgRGB)
# print(results.multi_hand_landmarks)
if self.results.multi_hand_landmarks:
for handLms in self.results.multi_hand_landmarks:
if draw:
self.mpDraw.draw_landmarks(img, handLms,
self.mpHands.HAND_CONNECTIONS)
return img
def findPosition(self, img, handNo=0, draw=True):
lmList = []
if self.results.multi_hand_landmarks:
myHand = self.results.multi_hand_landmarks[handNo]
for id, lm in enumerate(myHand.landmark):
# print(id, lm)
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
# print(id, cx, cy)
lmList.append([id, cx, cy])
# if draw: 這部分代碼畫出了手上所有結點,因為比較難看,就注釋掉了,
# cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)
return lmList
def main():
pTime = 0
cTime = 0
cap = cv2.VideoCapture(0)
detector = handDetector()
while True:
success, img = cap.read()
img = detector.findHands(img)
lmList = detector.findPosition(img)
if len(lmList) != 0:
print(lmList[4])
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
(255, 0, 255), 3)
cv2.imshow("Image", img)
cv2.waitKey(1)
if __name__ == "__main__":
main()
同時列印出了手上的每個結點的位置變化,

三、 開發工具
Pycharm2021,Python3.7 .
四、 遇到的問題記錄
第一個問題: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
報錯:
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-_xlv4eex\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
這個問題,網上的一些解釋是,如果你匯入的是一個靜態圖片,那么要么是你的斜杠寫錯,
或者是你的路徑中有中文,不妨換個沒有中文的路徑,或者修改圖片為英文試試,
但是我這里是攝像頭:
解決方案:(可能只適用于我,不妨可以試試)
cap = cv2.VideoCapture(1) #這個是B站原始碼中的攝像頭編號
使用B站大神原始碼報錯后,我把上面這行代碼改成下面這樣,就好了,
cap = cv2.VideoCapture(0)
第二個問題:使用pip指令,下載opencv-python,numpy等報錯
在控制臺上使用pip指令下載是,經常碰到超時問題,本身檔案不大,但是你的下載速度只有12kb/s甚至只有幾kb每秒
遇到的問題例如下面這個:

其實這個問題就是因為你的下載速度太慢導致的,
解決方案:使用國內鏡像安裝
這時候,考慮使用國內鏡像安裝,會快很多,.點擊進入國內鏡像安裝教程
一般numpy,opencv-python都有國內鏡像,不過我安裝mediatepipe時,并沒有找到國內鏡像,但是控制臺cmd使用下面這個指令太慢了,也是只有幾kb/s
pip install mediapipe
所以我選擇了去PyCharm去下載:
方式:
File—>Setting—>Project:python-project-Python Interpreter(Python解釋器)


點擊“+”,添加解釋器,然后在搜索框中搜索你需要的package即可,opencv-python,numpy,mediapipe都可以直接搜到,

點擊下面的Install Package即可,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/303024.html
標籤:其他
上一篇:基于SSH的在線駕校考試系統
