人脸检测指在静态或动态的场景、复杂的背景中判断是否存在面像,并分离出这种面像。
任务1.1:在提供的people.jpg图像中,使用OpenCV识别人脸,并用矩形框进行标注。
准备好图像,撰写代码,参考如下:
import numpyas np import cv2 as cv # 加载人脸特征识别器 face_cascade = cv.CascadeClassifier('cascade_files/haarcascade_frontalface_alt.xml') # 加载目标图像 img = cv.imread('people.jpg') # 将图像转化为灰度图 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 人脸检测 faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: # 画出人脸的矩形框(蓝色) cv.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows() |
“people.jpg”中有三张人脸,运行结果如图所示。
需要注意的是:import cv2中的“2”并不表示OpenCV的版本号。OpenCV是基于C/C++的,“cv”和“cv2”表示的是底层C API和C++ API的区别,“cv2”表示使用的是C++ API。
另外,人脸检测的核心方法调用说明如下:
void detectMultiScale( const Mat& image, CV_OUT vector<Rect>& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() ); |
其中,参数image用来指定需要检测的图像。参数scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,表示每次搜索窗口依次扩大10%。参数minNeighbors表示构成检测目标的相邻矩形的最小个数(默认为3个)。
任务1.2:假设还想在人脸中检测出鼻子,并进行标注。
参考代码如下:
import numpyas np import cv2 as cv # 加载人脸检测器 face_cascade = cv.CascadeClassifier('cascade_files/haarcascade_frontalface_alt.xml') # 初始化鼻子检测模型 nose_cascade = cv.CascadeClassifier('cascade_files/haarcascade_mcs_nose.xml') img = cv.imread('people.jpg') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 人脸检测 faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: # 画出人脸的矩形框(蓝色) cv.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] # 鼻子检测 noses = nose_cascade.detectMultiScale(roi_gray,1.3,5) for (ex,ey,ew,eh) in noses: # 画出鼻子的矩形框(绿色) cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) break cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows() |
运行结果如图所示。
![](https://p.ananas.chaoxing.com/star3/origin/04b5591283c5c85ea81d398e3c99af8a.png)