运行Mediapipe姿态检测代码报findPose()缺少self参数如何解决?
错误原因
你遇到的报错是Python基础语法错误,和PyCharm无关,你搜到的「PyCharm仅支持列表、元组等类型参数传入」的说法完全错误,具体问题出在两处:
- 类未实例化导致self参数缺失:你写的
detector = poseDetector是将类本身赋值给了变量,没有创建类的实例,调用实例方法findPose时Python无法自动传入实例对象self,因此触发参数缺失报错。 - 全局变量滥用导致img参数缺失:你通过声明全局变量解决img找不到的问题属于临时补丁,不符合代码封装逻辑,也容易引发后续变量冲突问题。
修正步骤
- 实例化poseDetector类,创建实例对象后再调用实例方法
- 修改
findPose方法,将img作为入参传入,去掉所有全局变量声明 - 调用
findPose时传入每帧读取到的img对象
修正后完整代码
import cv2 import time import mediapipe as mp def main(): cap = cv2.VideoCapture(0) pTime = 0 # Previous time # 实例化poseDetector类 detector = poseDetector() while True: success, img = cap.read() # 传入当前帧img调用姿态检测方法 detector.findPose(img) cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, str(int(fps)), (70, 50), cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 3, (255, 0, 0), 3) cv2.imshow("Image", img) cv2.waitKey(1) class poseDetector(): def __init__(self, mode=True, complexity=1, smooth=True, detectionCon=0.5, trackCon=0.5): self.mode = mode self.complexity = complexity self.smooth = smooth self.detectionCon = detectionCon self.trackCon = trackCon self.mpDraw = mp.solutions.drawing_utils self.mpPose = mp.solutions.pose # 如果你使用的是较新版本的mediapipe,此处可以改为关键字参数避免顺序错误: # self.pose = self.mpPose.Pose(static_image_mode=self.mode, model_complexity=self.complexity, # smooth_landmarks=self.smooth, min_detection_confidence=self.detectionCon, # min_tracking_confidence=self.trackCon) self.pose = self.mpPose.Pose(self.mode, self.complexity, self.smooth, self.detectionCon, self.trackCon) # 添加img参数 def findPose(self, img, draw=True): imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = self.pose.process(imgRGB) if results.pose_landmarks and draw: self.mpDraw.draw_landmarks(img, results.pose_landmarks, self.mpPose.POSE_CONNECTIONS) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Aditya Deshpande
相关产品推荐
相关产品推荐

