我目前正在使用MTCNN进行人脸检测算法的研究。
使用下面的代码,我可以显示包含我的脸的帧:
`def run_detection(fast_mtcnn):
frames = []
frames_processed = 0
faces_detected = 0
batch_size = 60
start = time.time()
cap = cv2.VideoCapture(0)
while True:
__, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frames.append(frame)
faces = fast_mtcnn(frames)
frames_processed += len(frames)
faces_detected += len(faces)
frames = []
if len(faces) > 0:
for face in faces:
cv2.imshow('frame',face)
print(
f'Frames per second: {frames_processed / (time.time() - start):.3f},',
f'faces detected: {faces_detected}\r',
end=''
)
if cv2.waitKey(1) &0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()`
顺便说一句,cv2.imshow('frame',face)
只是让我把一些价值在那里,因为我想得到它的bouding框。
它看起来像这样(请原谅我的愚蠢的表情):
enter image description here
这我只是为了表明,它正在检测的脸,并采取了帧有关我的脸。
我面临的挑战是,如何获取较小的帧face
(包含我的脸),并获得它的边缘坐标,以便为frame
中的每个人绘制一个边界框。
我尝试了以下方法:
cv2.rectangle(frame,
(face[0], face[1]),
(face[0]+face[2], face[1] + face[3]),
(0,155,255),
2)
我想这是完全错误的。
1条答案
按热度按时间erhoui1w1#
解决方案取决于人脸检测系统返回点的方式,而人脸检测系统根据您使用的库可能会有所不同。在 * 这种 * 情况下,检测到的人脸包含以下信息
x, y, w, h = face
,其中x
和y
是点,w
是边界框的宽度,h
是高度。因此,可以按如下方式绘制面的矩形: