OpenCV手部追踪报错:输入图像深度不支持CV_64F 转float32仍触发错误
MediaPipe手部追踪报错解决方案
报错根因梳理
- 第一个
Unsupported depth of input image报错:MediaPipe的hands.process()仅支持数据类型为uint8或float32的输入图像,你当前传入的图像为CV_64F(即64位浮点型)不符合要求,同时颜色空间转换参数使用错误,默认摄像头读取的图像为BGR3通道格式,不是BGRA4通道格式。 - 第二个布尔类型无
astype方法报错:cap.read()返回的第一个参数是读取成功标识success,如果读取失败img会返回布尔类型的False,直接传入处理函数就会触发该报错,同时你未对handDetector类进行实例化,直接赋值类对象调用方法也会导致参数异常。
修复步骤
- 修正
handDetector类的实例化写法,加上括号创建实例 - 每次读取摄像头帧后先判断
success是否为True,读取失败直接跳过当前循环 - 修正颜色空间转换参数为
cv2.COLOR_BGR2RGB,如果确认你的输入是4通道BGRA格式再用原参数 - 转换图像数据类型为
uint8,适配MediaPipe的输入要求
注意:如果使用较新版本的MediaPipe(0.8.10及以上),
Hands类初始化需要显式指定参数名避免顺序错误,可调整初始化代码:self.hands = self.mpHands.Hands( static_image_mode=self.mode, max_num_hands=self.maxHands, min_detection_confidence=self.detectCon, min_tracking_confidence=self.trCon )
修复后核心代码片段
def findHands(self, img, draw = True): # 确保图像为uint8类型适配MediaPipe输入要求 img = img.astype('uint8') # 修正颜色空间转换参数 imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = self.hands.process(imgRGB) if results.multi_hand_landmarks: for handL in results.multi_hand_landmarks: if draw: self.mpDraw.draw_landmarks(img, handL, self.mpHands.HAND_CONNECTIONS) return img def main(): cap = cv2.VideoCapture(0) pTime = 0 cTime = 0 # 修正:实例化handDetector类 detector = handDetector() while True: success, img = cap.read() # 新增:判断帧读取是否成功,避免传入布尔值报错 if not success: continue img = detector.findHands(img, True) cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (60, 50, 255), 3) cv2.imshow("Image", img) Q = cv2.waitKey(33) if(Q)==27: break # 新增:释放资源避免内存残留 cap.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者SilentH11
相关产品推荐
相关产品推荐

