基于opencv的简单人脸检测(python)

发布时间:2024年01月21日

????????OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的C函数和少量C++类构成,同时提供Python、Java和MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

????????在windows系统下,建议使用python的包安装工具pip来安装Opencv。win+r输入cmd打开命令行输入

pip install opencv-python

????????安装完成后打开编译器,我这里使用的是SublimeText,Sublime Text 是一个文本编辑器,同时也是一个先进的代码编辑器。Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的?Python?API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、LinuxMac OS X等操作系统。最大的好处就是轻便,比较小,下载起来也比较方便。

? ? ? ? 首先导入opencv库

import cv2 as cv

? ? ? ? 加载图片并调用封装好的人脸检测函数,注释掉的部分可以用来修改图片大小并保存

#加载图片
img=cv.imread('face3.jpg')
'''resize_img=cv.resize(img,dsize=(400,400))
cv.imwrite('wes1.jpg',resize_img)'''
face_detect_demo()

? ? ? ? 人脸检测函数,其中CascadeClassifier()方法中调用的是opencv开源的人脸检测模板这里选择的是默认正脸模板xml文件。可以自行到opencv官网下载。https://opencv.org/releases/下载完成后双击安装会得到一个文件夹,模板文件夹路径与我程序中的路径相同。

def face_detect_demo():
	#将图片转换为灰度图片
	gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
	#加载特征数据
	face_detector=cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
	#face=face_detector.detectMultiScale(gray,scaleFactor=1.02,minSize=(151,151))
	face=face_detector.detectMultiScale(gray,scaleFactor=1.03,minNeighbors=3,maxSize=(45,45))
	#face=face_detector.detectMultiScale(gray)
	for x,y,w,h in face:
		print(x,y,w,h)
		cv.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
		#cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=2)
	cv.imshow('result',img)

?detectMultiScale函数概述

????????detectMultiScale函数是OpenCV中用于目标检测的函数,它可以用来检测图像中是否存在指定的目标,并返回目标位置的矩形边界框。函数定义如下:

detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)

????????scaleFactor参数控制每个图像序列的缩放比例。该参数决定了在每个图像序列中检测窗口的大小。默认值为1.1,表示每次图像被缩小10%。较小的值可以捕捉更多的细节,但也会增加计算量。较大的值可以加快检测速度,但可能会错过一些目标。示例代码如下:

face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)

????????minNeighbors参数定义了每个目标至少应该有多少个邻居,才能被认为是一个目标。该参数用于过滤检测到的目标。较大的值可以过滤掉一些误检测,但可能会导致一些目标被漏检。 默认为3。示例代码如下:

face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)

????????minSize参数用于指定检测目标的最小尺寸。目标小于该尺寸的将被忽略。该参数可以用于过滤一些过小的目标。?示例代码如下:

face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(30, 30))

????????maxSize参数用于指定检测目标的最大尺寸。目标大于该尺寸的将被忽略。该参数可以用于过滤一些过大的目标。?

face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, maxSize=(300, 300))

完整代码

import cv2 as cv

def face_detect_demo():
	#将图片转换为灰度图片
	gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
	#加载特征数据
	face_detector=cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
	#face=face_detector.detectMultiScale(gray,scaleFactor=1.02,minSize=(151,151))
	face=face_detector.detectMultiScale(gray,scaleFactor=1.03,minNeighbors=3,maxSize=(45,45))
	#face=face_detector.detectMultiScale(gray)
	for x,y,w,h in face:
		print(x,y,w,h)
		cv.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
		#cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=2)
	cv.imshow('result',img)

#加载图片
img=cv.imread('face3.jpg')
'''resize_img=cv.resize(img,dsize=(400,400))
cv.imwrite('wes1.jpg',resize_img)'''
face_detect_demo()

cv.waitKey(0)
cv.destroyAllWindows()

检测效果图

通过对detectMultiScale函数参数的调整可以实现同一张图多张人脸的检测效果,根据不同的图片调整不同的参数即可。

文章来源:https://blog.csdn.net/qq_64161215/article/details/135638075
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。