在开始之前,我们需要准备一些必要的工具和环境:
- Python3.6.3
- OpenCV3.3.0
- 摄像头设备(PC自带或USB摄像头)
如果你还没有安装Python3和OpenCV,可以参考以下步骤:
mkdir build
cd build
cmake ../
make
sudo make install
在安装前,需要确保已经安装了cmake和其他依赖项。具体可以参考OpenCV官方文档。
我们使用Python3.6.3和OpenCV3.3.0来实现动态人脸捕获。具体步骤如下:
我们需要导入cv2,numpy和os库来实现人脸捕获。
import cv2
import numpy as np
import os
OpenCV提供了许多人脸分类器,我们可以使用其中的之一来检测人脸。在这里,我们使用的是haarcascade_frontalface_alt.xml
。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
cap = cv2.VideoCapture(0)
其中0表示打开默认的摄像头设备,如果有多个设备,可以设置为1、2、3等。
ret, frame = cap.read()
其中ret表示摄像头是否正常打开,frame表示读取到的一帧图像。
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
其中,我们首先将图像转换为灰度图像(这一步会提高程序的运行速度),然后使用detectMultiScale
函数检测人脸。scaleFactor
、minNeighbors
、minSize
等参数需要我们根据实际情况进行调整。
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
这一步,我们在读取到的每一帧图像中,将检测到的每一个人脸用绿色的矩形框出来。(x, y)
表示矩形框左下角的坐标,(x+w, y+h)
表示矩形框右上角的坐标。
cv2.imshow('Face Detection', frame)
这一步,我们将处理后的图像显示出来,然后等待ESC
键的输入。
cap.release()
cv2.destroyAllWindows()
最后,我们释放摄像头资源并关闭所有窗口。
下面的代码实现动态人脸捕获的功能,只需要运行就可以在打开的窗口中实时显示摄像头捕获到的人脸。
import cv2
import numpy as np
import os
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Face Detection', frame)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
下面的代码实现读取一张图片,并在上面用矩形框出其中的人脸。
import cv2
import numpy as np
import os
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
img = cv2.imread('test_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Face Detection', img)
cv2.waitKey()
cv2.destroyAllWindows()