郫县网站制作,泰兴市建设局网站,餐饮营销策划与运营,河南郑州地图OpenCV 是一个基于 Apache2.0 许可#xff08;开源#xff09;发行的跨平台计算机视觉和机器学习软件库#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.tsi… OpenCV 是一个基于 Apache2.0 许可开源发行的跨平台计算机视觉和机器学习软件库可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.tsinghua.edu.cn/simple mediapipe
接着上一章的内容这一次我们加入了fps显示和模块封装以便我们接下来的学习。 import cv2
import numpy as np
import mediapipe as mp
import time这部分是导入所需的Python库。cv2 是OpenCV库用于图像处理和计算机视觉任务。numpy 用于数值计算。mediapipe 是一个Google开发的库用于处理计算机视觉任务例如姿势检测、手势识别等。time 是Python标准库用于处理时间相关的操作。 class handDetector():def __init__(self, modeFalse, maxHands2, detectionCon0.5, trackCon0.5):self.mode modeself.maxHands maxHandsself.detectionCon detectionConself.trackCon trackConself.mpHands mp.solutions.handsself.hands self.mpHands.Hands(self.mode, self.maxHands, self.detectionCon, self.trackCon)self.mpDraw mp.solutions.drawing_utils这部分定义了一个名为 handDetector 的类。它有一个构造函数 __init__用于初始化手部检测器对象。传递给构造函数的参数包括 mode: 用于设置手部检测的模式默认为 False。maxHands: 最大检测手的数量默认为 2。detectionCon: 检测的置信度阈值默认为 0.5。trackCon: 跟踪的置信度阈值默认为 0.5。
在构造函数中还初始化了 mpHandshands 和 mpDraw 对象。mpHands 是 mediapipe 库中的手部检测模块hands 是用于手部检测的实际处理器mpDraw 是用于在图像上绘制标记的实用工具。 def findHands(self, img, drawTrue):imgRGB cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results self.hands.process(imgRGB)if results.multi_hand_landmarks:for handLms in results.multi_hand_landmarks:if draw:self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)return img这部分定义了一个名为 findHands 的方法用于在给定图像上进行手部检测。它接受一个图像img和一个布尔值参数 draw用于指定是否绘制检测结果。 在方法中首先将图像转换为RGB格式然后使用手部检测器 hands 处理图像返回结果。如果检测到了手部就遍历每个检测到的手部标记点然后在图像上绘制出手部标记和连接线。最后返回绘制了标记的图像。 def findPosition(self,img,handNO0,draw True):lmList []if self.results.multi_hand_landmarks:myHand self.results.multi_hand_landmarks[handNO]for id, lm in enumerate(myHand.landmark):h, w, c img.shapecx, cy int(lm.x * w), int(lm.y * h)lmList.append([id,cx,cy])if draw:cv2.circle(img, (cx, cy), 10, (255, 255, 0), cv2.FILLED)return lmList这部分定义了 findPosition 方法用于获取手部标记点的坐标。方法接收一个图像img、一个可选的 handNO 参数表示检测到的手部编号默认为0和一个布尔值参数 draw。方法首先检查是否有检测到的手部如果有就获取指定编号的手部标记点信息。然后遍历手部标记点计算并保存标记点的坐标并在图像上绘制圆圈。最后返回标记点坐标的列表。 def main():pTime 0cTime 0cap cv2.VideoCapture(0)detector handDetector(maxHands1)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 cTimecv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,(255, 0, 155), 3)cv2.imshow(Image, img)cv2.waitKey(1)if __name__ __main__:main() 这部分定义了一个名为 main 的函数用于主要的程序逻辑。在其中首先初始化了摄像头捕获对象 cap然后创建了一个 handDetector 的实例即手部检测器。
进入主循环不断从摄像头捕获图像然后调用 detector.findHands(img) 进行手部检测和绘制将结果显示在窗口中。还计算并绘制了帧率信息。
最后使用 cv2.waitKey(1) 来处理键盘输入允许用户退出程序。
总体来说这段代码实现了从摄像头捕获图像并使用 mediapipe 进行手部检测和标记绘制同时还显示了帧率信息。这可以用于实时手势识别和交互应用。 帧率在三十左右