如何修复Python中OpenCV+MediaPipe手部识别的参数类型错误
手部识别项目运行报错解决
问题背景
参照网上视频复刻手部识别项目,初始代码运行正常,在VS Code项目文件夹中添加另一个脚本后,程序每次运行均抛出错误。已尝试重新安装并升级所有依赖包,但问题仍未解决。
项目代码
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) 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): h, w, c = img.shape cx, cy = int(lm.x * w), int(lm.y * h) 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(1) 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()
错误信息
Traceback (most recent call last): File "d:\Hand Gensture Tracking AI\HandTrackingModule.py", line 71, in <module> main() File "d:\Hand Gensture Tracking AI\HandTrackingModule.py", line 51, in main detector = handDetector() File "d:\Hand Gensture Tracking AI\HandTrackingModule.py", line 14, in __init__ self.hands = self.mpHands.Hands(self.mode, self.maxHands, File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\mediapipe\python\solutions\hands.py", line 114, in __init__ super().__init__( File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\mediapipe\python\solution_base.py", line 288, in __init__ self._input_side_packets = { File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\mediapipe\python\solution_base.py", line 289, in <dictcomp> name: self._make_packet(self._side_input_type_info[name], data) File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\mediapipe\python\solution_base.py", line 591, in _make_packet return getattr(packet_creator, 'create_' + packet_data_type.value)(data) TypeError: create_int(): incompatible function arguments. The following argument types are supported: 1. (arg0: int) -> mediapipe.python._framework_bindings.packet.Packet Invoked with: 0.5
问题分析与解决
核心原因
错误信息明确显示:create_int()需要传入整数,但代码中传入了0.5这个浮点数。问题出在mediapipe版本差异上:新版本的Hands类要求detectionCon和trackCon参数为整数(代表百分比,如50即50%),而代码中传入的是0-1范围的浮点数。
添加新脚本后触发问题,大概率是新脚本安装/升级了mediapipe版本,导致参数规则变化。
两种修复方案
方案1:修改代码适配新版本
将handDetector类的初始化参数改为整数,并保持传入一致:
class handDetector(): # 修改默认值为整数(50代表50%) def __init__(self, mode=False, maxHands=2, detectionCon=50, trackCon=50): 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
方案2:回退到兼容浮点数的旧版本
如果想继续使用0-1范围的浮点数参数,可以安装旧版本的mediapipe(比如0.8.11版本):
pip install mediapipe==0.8.11
内容的提问来源于stack exchange,提问作者Karen Movsesyan
相关产品推荐
相关产品推荐

