OpenCV项目实战---人脸检测( 三 )

 faces=face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)# 用人脸级联分类器引擎进行人脸识别 , 返回的faces为人脸坐标列表 , 1.3是放大比例 , 5是重复识别次数  
整体代码如下:
importcv2img=cv2.imread('image1.jpg',1)face_engine=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')faces=face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)for(x,y,w,h)infaces:    img =cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)cv2.imshow('img2',img)cv2.waitKey(0)cv2.destroyAllwindows()cv2.imwrite('output.jpg',img)  
注:
* cv2.waitKey等待键盘输入 , 单位为毫秒 , 即等待指定的毫秒数看是否有键盘输入 , 若在等待时间内按下任意键则返回按键的ASCII码 , 程序继续运行 。若没有按下任何键 , 超时后返回-1 。参数为0表示无限等待 。不调用waitKey的话 , 窗口会一闪而逝 , 看不到显示的图片 。
* cv2.destroyAllWindow()销毁所有窗口
* cv2.destroyWindow(wname)销毁指定窗口
 
运行结果图

OpenCV项目实战---人脸检测

文章插图
 
由此可以看出此代码运行结果良好 , 符合预期结果 。
 
代码改进
上述代码为引入本地图片来进行人脸测量 。现在改进下代码 , 可以通过摄像头进行实时的人脸检测 。
在源代码的基础上 , 增加以下语句:
cap=cv2.VideoCapture(0)while(True):   # 获取摄像头拍摄到的画面    ret, frame=cap.read()faces=face_cascade.detectMultiScale(frame,1.3,5)#frame是摄像头捕捉到的画面 .....    #每隔5毫秒监听一次键盘 , 当按下q键时退出摄像窗口ifcv2.waitKey(5)&0xFF==ord('q'):   break# 关闭所有窗口cap.release()cv2.destroyAllWindows() 
利用手机播放视频 , 可进行实时人脸检测 , 运行结果良好 。结果如图
OpenCV项目实战---人脸检测

文章插图
 
注:
1)在用cv2.rectangle进行画框时 , 原始定义为(图像 , 左上角 , 右下角) 。但由于疏忽 , 有一次我将左上角和右下角的坐标顺序写反 , 即(右下角 , 左上角) 。但是结果却依然正确 。在后来我将数据改为(右上角 , 左下角)(左下角 , 右上角) , 结果依然一样 。因此得知 , rectangle是利用对角线来进行矩形的框定 。
在此附上此次验证的相关代码:
 import cv2# filepath = "./men-face.jpg"image = cv2.imread('./men-face.jpg',cv2.IMREAD_GRAYSCALE)h, w = image.shape[:2]h, w = map(int, [h/4, w/4])draw_0 = cv2.rectangle(image, (2*w, 2*h), (3*w, 3*h), (255, 0, 0), 2)draw_1 = cv2.rectangle(image, (2*w, 3*h), (3*w, 2*h), (255, 0, 0), 2)draw_2 = cv2.rectangle(image, (3*w, 2*h), (2*w, 3*h), (255, 0, 0), 2)draw_3 = cv2.rectangle(image, (3*w, 3*h), (2*w, 2*h), (255, 0, 0), 2)cv2.imshow("origin.jpg", draw_0)cv2.imshow("change1.jpg", draw_1)cv2.imshow("change2.jpg", draw_2)cv2.imshow("change3.jpg", draw_3)cv2.waitKey(0)cv2.destroyAllWindows()
OpenCV项目实战---人脸检测

文章插图
 
2)HOG的发明者是Navneet Dalal , 在2005年其在CVPR上发表了Histograms of Oriented Gradients forHuman Detection这一篇论文 。
HOG算法思想:
在计算机视觉以及数字图像处理中梯度方向直方图(HOG)是一种能对物体进行检测的基于形状边缘特征的描述算子 , 它的基本思想是利用梯度信息能很好的反映图像目标的边缘信息并通过局部梯度的大小将图像局部的外观和形状特征化 。一些研究者利用梯度HOG特征并结合其他特征对人体进行检测得到了较好的结果 。
HOG特征的提取可以用下图所示的过程表示: 颜色空间的归一化是为了减少光照以及背景等因素的影响;划分检测窗口成大小相同的细胞单元(cell) , 并分别提取相应的梯度信息;组合相邻的细胞单元成大的相互有重叠的块(block) , 这样能有效的利用重叠的边缘信息 , 以统计整个块的直方图;并对每个块内的梯度直方图进行归一化 , 从而进一步减少背景颜色及噪声的影响;最后将整个窗口中所有块的HOG特征收集起来 , 并使用特征向量来表示其特征 。在这一过程中 , 不同尺度的参数模板、梯度方向的选择、重叠块及单元格的大小还有归一化因子等因素都会影响最终的检测结果 。最终通过SVM或cascade分类器分离出正确的行人目标 。


推荐阅读