cv2与PyTorch人脸识别项目中cv2.rectangle参数错误排查
问题解决:OpenCV绘制矩形参数错误
报错的核心原因是人脸框坐标的类型不匹配:boxes里的坐标是浮点数,而OpenCV的rectangle、putText函数要求坐标必须是整数(像素位置只能是整数索引)。
修复步骤
获取人脸框后,立即将所有坐标转换为整数类型:
如果boxes是Python列表:box = boxes[i] # 把每个坐标转为整数 box = [int(coord) for coord in box]如果
boxes是PyTorch张量(GPU/CPU):box = boxes[i].cpu().numpy().astype(int)修改后的完整代码片段:
for i, prob in enumerate(prob_list): if prob>0.90: emb = resnet(img_cropped_list[i].unsqueeze(0)).detach() dist_list = [] # 存储匹配距离,最小距离对应识别的人 for idx, emb_db in enumerate(embedding_list): dist = torch.dist(emb, emb_db).item() dist_list.append(dist) min_dist = min(dist_list) # 获取最小距离值 min_dist_idx = dist_list.index(min_dist) # 获取最小距离的索引 name = name_list[min_dist_idx] # 获取对应名字 box = boxes[i] # 关键:将坐标转为整数 box = [int(coord) for coord in box] original_frame = frame.copy() # 保存绘制前的帧副本 if min_dist<0.90: frame = cv2.putText(frame, f"{name} {min_dist:.2f}", (box[0],box[1]), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0),1, cv2.LINE_AA) frame = cv2.rectangle(frame, (box[0],box[1]) , (box[2],box[3]), (255,0,0), 2)
额外说明
- 也可以用
round()代替int(),但int()会直接截断小数部分,更符合像素坐标的取整逻辑。 - 确认
boxes中每个元素都是包含4个值的序列(x1,y1,x2,y2),避免出现长度不足4的情况(报错里的"Expected sequence length 4, got 2"提示可能存在这个问题,需检查人脸检测部分的输出)。
内容的提问来源于stack exchange,提问作者Durian
相关产品推荐
相关产品推荐

