只显示关键点,不显示摄像头画面
import numpy as np
from imutils import face_utils
import dlib
import cv2
p = "shape_predictor_68_face_landmarks.dat"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(p)
cap = cv2.VideoCapture(0)
while True:
_, image = cap.read()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rects = detector(gray, 0)
# 尺寸可以根据需要调整,绘制新图像,用于只显示关键点,不显示人脸
image = np.zeros((500, 500, 3), dtype="uint8")
for (i, rect) in enumerate(rects):
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape)
for j, (x, y) in enumerate(shape):
cv2.circle(image, (x, y), 1, (0, 255, 0), -1)
# cv2.putText(image, str(j + 1), (x + 5, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1)
cv2.imshow("Output", image)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
cap.release()
现有代码中,导致摄像头画面不显示的原因可能是在循环中创建了一个空白的图像数组,并且没有将检测到的人脸标记绘制到原始图像上,而是绘制到了这个空白图像上。具体来说,问题出在以下这段代码:
image = np.zeros((500, 500, 3), dtype="uint8") # 尺寸可以根据需要调整
这行代码创建了一个500x500像素的空白图像,并且后续的操作都是在这个空白图像上进行的。因此,原始的摄像头画面并没有被显示出来。
为了让人脸正常显示,你需要将人脸标记绘制到原始图像上,而不是空白图像上。以下是修改后的代码段:
# ... 省略之前的代码 ...
while True:
_, image = cap.read() # 读取原始图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rects = detector(gray, 0)
for (i, rect) in enumerate(rects):
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape)
# 绘制人脸标记到原始图像上
for j, (x, y) in enumerate(shape):
cv2.circle(image, (x, y), 1, (0, 255, 0), -1)
# cv2.putText(image, str(j + 1), (x + 5, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1)
# 显示原始图像,上面有绘制的人脸标记
cv2.imshow("Output", image)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
# ... 省略之后的代码 ...
注意,我已经将创建空白图像的代码行删除了,并且将绘制人脸标记的代码移动到了原始图像上。这样,摄像头的画面就会正常显示,并且上面会有人脸标记。