Python手部追踪项目报错TypeError: NoneType无len(),求错误排查
OpenCV手部追踪项目TypeError错误分析与修复
错误原因
你遇到的TypeError: object of type 'NoneType' has no len(),本质是landmarklist变量为None时调用了len()方法。问题出在findPosition函数的返回逻辑:
- 只有当
self.result.multi_hand_landmarks(检测到手部)时,函数才会返回landmarklist; - 若未检测到手部,函数没有显式返回值,Python会默认返回
None; - 而你在主循环里直接对
landmarklist执行len()判断,自然触发错误。
另外还有一个潜在问题:camera.read()可能读取失败(比如摄像头未正常连接),此时frame为None,后续调用findhands和findPosition会引发更多错误。
修复方案
1. 修正findPosition函数的返回逻辑
确保无论是否检测到手部,函数都返回列表类型(空列表或包含 landmark 的列表):
def findPosition(self, frame, handNomor = 0, draw=True): landmarklist = [] if self.result.multi_hand_landmarks: tanganku = self.result.multi_hand_landmarks[handNomor] for id, lm in enumerate(tanganku.landmark): h, w, c = frame.shape cx, cy = int(lm.x * w), int(lm.y * h) landmarklist.append([cx, cy, id]) if draw: cv2.circle(frame, (cx, cy), 2, (195, 26, 195), cv2.FILLED) # 统一返回列表,避免返回None return landmarklist
2. 主循环添加帧有效性判断
在处理帧之前,先确认摄像头成功读取到帧,同时补充窗口显示和退出逻辑(否则程序会无响应):
def main(): ptime = 0 ctime = 0 detector = handDetector() camera = cv2.VideoCapture(0) while True: start, frame = camera.read() # 判断是否成功获取帧 if not start: print("无法读取摄像头画面,请检查设备连接") break frame = detector.findhands(frame) landmarklist = detector.findPosition(frame) if len(landmarklist) != 0: print(landmarklist[4]) # 计算并显示FPS ctime = time.time() fps = 1 / (ctime - ptime) ptime = ctime cv2.putText(frame, f'FPS: {int(fps)}', (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3) # 显示画面和退出逻辑 cv2.imshow("Hand Tracking", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头资源并关闭窗口 camera.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者NoobProgrammer
相关产品推荐
相关产品推荐

