基于dlib的人脸识别应用:如何用cv2.putText在人脸上方显示姓名?
在人脸识别结果上方绘制姓名的实现方案
我来帮你搞定这个需求!要在检测到的人脸上方用cv2.putText()写入姓名,核心是先拿到人脸检测框的坐标,再计算文字的合适位置,最后完成绘制。你的现有代码已经完成了人脸识别的核心逻辑,只差坐标获取和文字绘制的部分,下面是具体的修改步骤:
1. 确保你能获取人脸检测框的坐标
你的代码里循环遍历的是face_image,但要绘制文字必须知道这个人脸在原图像中的位置。假设你是用dlib的人脸检测器(比如get_frontal_face_detector())得到的人脸框,那修改循环,同时遍历检测框和人脸区域:
# 假设你已经用dlib检测器得到了人脸框列表rects for k, rect in enumerate(rects): # 从原图像中提取人脸区域(对应你代码里的face_image) x1 = rect.left() y1 = rect.top() x2 = rect.right() y2 = rect.bottom() face = original_image[y1:y2, x1:x2] # original_image是你的输入图像 # --- 下面是你原有的识别代码 --- faceBlob = cv2.dnn.blobFromImage(face, 1.0 / 255, (96, 96), (0, 0, 0), swapRB=True, crop=False) embedder.setInput(faceBlob) vec = embedder.forward() preds = recognizer.predict_proba(vec)[0] j = np.argmax(preds) proba = preds[j] name = le.classes_[j] # --- 识别代码结束 --- # 接下来添加文字绘制逻辑
如果你用的是OpenCV的人脸检测器(比如Haar级联),检测结果是(x, y, w, h),那坐标转换为:
x1 = x y1 = y x2 = x + w y2 = y + h
2. 计算文字的绘制位置
要把姓名放在人脸上方,需要让文字的底部略高于人脸框的顶部,同时避免文字超出图像边界:
- 先计算文字的尺寸(可选,但能避免文字出界)
- 设定文字的x坐标和y坐标(比如左对齐,y坐标为人脸框顶部减10像素,如果太靠近顶部就调整到图像内)
3. 调用cv2.putText完成绘制
结合置信度一起显示会更直观,同时可以绘制人脸框让结果更清晰:
# 定义绘制参数 font_style = cv2.FONT_HERSHEY_SIMPLEX font_size = 0.7 text_color = (0, 255, 0) # 绿色文字,可根据需求调整 line_thickness = 2 # 生成要显示的文本(包含姓名和置信度) display_text = f"{name}: {proba * 100:.2f}%" # 计算文本的宽高,用于调整位置 (text_w, text_h), _ = cv2.getTextSize(display_text, font_style, font_size, line_thickness) # 确定文本的左下角坐标:左对齐,位于人脸框上方 text_x = x1 text_y = y1 - 10 if y1 - 10 > text_h else text_h + 5 # 避免文字超出图像顶部 # 绘制文本 cv2.putText(original_image, display_text, (text_x, text_y), font_style, font_size, text_color, line_thickness) # 可选:绘制人脸检测框 cv2.rectangle(original_image, (x1, y1), (x2, y2), text_color, line_thickness)
关键注意事项
- 确保你操作的是原图像(
original_image),而不是提取出的人脸小图face - 如果人脸靠近图像顶部,一定要判断
text_y的数值,避免文字被截断 - 可以根据需求调整字体、颜色、大小等参数,比如用
cv2.FONT_HERSHEY_COMPLEX字体更美观
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

