You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

cv2与PyTorch人脸识别项目中cv2.rectangle参数错误排查

问题解决:OpenCV绘制矩形参数错误

报错的核心原因是人脸框坐标的类型不匹配:boxes里的坐标是浮点数,而OpenCV的rectangle、putText函数要求坐标必须是整数(像素位置只能是整数索引)。

修复步骤

  1. 获取人脸框后,立即将所有坐标转换为整数类型:
    如果boxes是Python列表:

    box = boxes[i]
    # 把每个坐标转为整数
    box = [int(coord) for coord in box]
    

    如果boxes是PyTorch张量(GPU/CPU):

    box = boxes[i].cpu().numpy().astype(int)
    
  2. 修改后的完整代码片段:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:01:33