与前面人脸检测区别就是代码中换了xml文件,还有就是detectMultiScale()中的参数选择为默认。
上代码:
#导入cv模块 import cv2 as cv #检测函数 def face_detect_demo(): gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY) face_detect = cv.CascadeClassifier('E:/Python/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml') face = face_detect.detectMultiScale(gary) for x,y,w,h in face: cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2) cv.imshow('result',img) #读取图像 img = cv.imread('face2.jpg') #检测函数 face_detect_demo() #等待 while True: if ord('q') == cv.waitKey(0): break #释放内存 cv.destroyAllWindows()
这里的face = face_detect.detectMultiScale(gary)函数,()里的参数都是选择默认值。在一张图中参数的设置结果会导致人脸检测的误差,并不是所有的人脸都会被检测到,也有些不是人脸的的地方被检测成人脸,这段代码改参数调试几次后,发现选择默认的检测结果最好。
detectMultiScale()中各参数介绍:
参数1:image–待检测图片,一般为灰度图像加快检测速度;
参数2:objects–被检测物体的矩形框向量组;
参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
参数4:**minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上;
参数5:flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为
CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;
参数6、7:minSize和maxSize用来限制得到的目标区域的范围。
看完也是稀里糊涂的,这里举个栗子:
face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))
gray:表示图片
1.01:表示每次检测人脸扩大的倍数
5:表示连续检测5次都为人脸时候,才确定是人脸
0:一般都用默认值0,不用改
(100,100):表示检测人脸最小的人脸,低于100*100的人脸检测不出
(300,300):表示能检测到最大的人脸,高于300*300的人脸检测不出
如果这些参数都不写,就表示选择默认值。
大概就是这样,也是新手上路,有不对的地方请指正。