关注分享主机优惠活动
国内外VPS云服务器

基于Opencv的手势识别(opencv实现手势识别)

总结:同时输出手部各节点位置的变化。 解决办法:使用国产镜子。 这时候就考虑使用国内的镜像安装,会快很多。 请点击下面。

文章目录 1.效果(版本2的影响) 2.所有源代码 版本1:未封装的代码 版本2:封装的代码 3.开发工具 4 遇到的问题记录 第一个问题:错误:(-215:断言失败) !_src.empty() in function 'cv::cvtColor' 解决方案:(也许只适用于我。尝试第二个问题:使用 pip 命令 下载 opencv-python、numpy、 ETC。 错误解决:使用国家镜像安装。

1.效果(版本2影响)

下面是Opencv模型的手势识别代码。 此源码来自B站Opencv大师教程

2、全部源码版本1:未封装代码

直接复制这段代码运行即可查看效果。

#!/usr/bin/python3.7#coding=utf-8import cv2import mediapipe as mpimport time#导入opencv模块#捕获帧并将笔记本电脑的相机设置为0。 """ VideoCapture的第一个参数是摄像机编号。 """capture =cv2.VideoCapture(0,cv2.CAP_DSHOW)#初始化(使用模型前) mpHands =mp.solutions.handshands=mpHands.Hands () mpDraw=mp.solutions.drawing_utilspTime=0cTime=0# 循环显示帧 True: 成功, img = Capture.read() imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) results=hands.process(imgRGB) """Image 对图像的一些处理""" # 如果手在相机范围内,则以下函数将返回相应的地标值。 否则,返回 None。 #print(results.multi_hand_landmarks) # 打印每个坐标。 手(一只手几十个点) if results.multi_hand_landmarks: print("Read Success!") 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:封装代码

这段代码封装在后台了。 直接引用就可以了。 根据需要。 但是,直接运行该程序可以获得相同的结果。

将 cv2import 媒体管道导入为 mpimport timeclass handDetector(): def __init__(self, mode=False, maxHands=2, detectorCon=0.5, trackCon=0.5): self.mode = 模式 self.maxHands = maxHands self.detectionCon = detectorCon 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 of self.results.multi_hand_landmarks: 用于绘图: self.mpDraw 。 绘制地标(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]) # ifdraw: 这部分代码绘制手上的所有节点。 我把它评论掉了,因为它很丑。 # cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) return lmListdef main(): pTime = 0 cTime = 0 cap = cv2.VideoCapture(0) detector = handDetector () 如果为真:成功, 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()

同时输出手部各节点的位置变化。

3.开发工具

Pycharm2021、Python3.7。

4.记录出现的第一个问题:Error: (-215:Assertion failed) !_src.empty() in function 'cv ::cvtColor'

Error:

imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

cv2.error: OpenCV(4.5.3) C :/Users/ runneradmin/AppData/Local/Temp/pip-req -构建-_xlv4eex/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

网上对此问题的描述包括:有一些东西像这样。 如果导入的是静态图片,要么是斜杠写错了,要么是路径中含有中文。 尝试将路径更改为不包含汉字的路径或将图像更改为英文。

但是这里是摄像头:

解决方案:(可能只适用于我,你也可以尝试一下) cap = cv2.VideoCapture(1)#这是源码中的摄像头编号B站的代码

使用哔哩哔哩大师源码并报错后,我将上面这行代码改成下面,就成功了。

cap = cv2.VideoCapture(0) 第二个问题:使用pip命令下载opencv-python、numpy等时出错

在控制台使用pip命令下载时,经常出现超时问题。 文件本身并不大,但下载速度只有12kb/s,或者说每秒只有几kb。 出现的问题有: 其实这个问题是由于下载速度太慢造成的。

解决方案:使用国内镜像安装

目前考虑使用国内镜像安装,速度快很多。 .点击进入国内镜像安装教程。 通常numpy和opencv-python都有国内镜像。 但是我安装mediatpipe的时候并没有找到国内的镜像,而且控制台cmd使用下面的命令太慢了: 也才几kb/s

pip install mediapipe

所以我决定去PyCharm下载:方法:File—>Settings—>Project:python-project- Python Interpreter (Python解释器)

单击“+”添加解释器并在搜索框中搜索所需的包。 opencv-python、numpy、mediapipe都可以直接搜索。 单击下面的“安装包”。

未经允许不得转载:主机频道 » 基于Opencv的手势识别(opencv实现手势识别)

评论 抢沙发

评论前必须登录!