简略的介绍一下 : opencv是什么? , 人脸检测是什么?

最近对机器学习有点感兴趣,想直接从图像识别入手,这里选择了鼎鼎有名的 opencv ,一开始想直接调用opencv的api进行人脸的检测,功能也特简单,一:检测出人脸,用方框标记一下,二:输出图片中存在几个人.

在opencv的 example 中找到了已经写好的示例,示例是对一个video中的图像识别,这里做一个简化,只是检测单独的一张图片.

import cv2
import sys
# Get user supplied values
imagePath = sys.argv[1]
# Create the haar cascade
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") #1
# Read the image
image = cv2.imread(imagePath)#2
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#3
# Detect faces in the image
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.15,
    minNeighbors=5,
    minSize=(5,5),
    flags = cv2.cv.CV_HAAR_SCALE_IMAGE
) #4
print "Found {0} faces!".format(len(faces))#5
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) #6
cv2.imshow("Faces found", image)#7
cv2.waitKey(0) #8

看一下检测效果:

其中python基础的部分就不管了,重点是opencv的使用:

#1中

faceCascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”)

这是初始化opencv的Cascade Classification,详情可参见Cascade Classification , 它的作用就是产生一个检测器,检测的依据全都储存在参数所代表的那个xml文件中,这个xml文件可以在 opencv-github 中获得,官方提供的还有眼睛,树等其他对象的识别数据,这些数据就是一张一张图像训练出来的, 这里 有一篇讲解如何自己训练得到检测数据的.

#2就是读取图像,

#3

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

将读取的图像转换成了 cv2.COLOR_BGR2GRAY格式 ,具体的算法可见:cvtcolor ,为什么要进行转换呢?

其实这里的检测的依据是 哈尔特征 ,转换后每个点的RGB数据变成了一维的灰度,计算的强度减小,其实不转换也是可以的.(就上述图像测试可行)

#4

faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.15,
    minNeighbors=5,
    minSize=(5,5),
    flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)

这是这段代码中的核心,这几个参数最终决定能否检测出.关于方法detectMultiScale,可以参见 detectmultiscale

这里只说参数起了什么作用.

gray : 进行检测的图像,这里是转换后的,

scaleFactor : 官网文档说是每次图片缩小的比例,其实可以这么理解,距离相机不同的距离,物体大小是不一样的,在物体大小不一致的情况下识别一个东西是不方便的,这就需要进行多次的缩放,这就是这个参数的作用.

minNeighbors : 可以理解为每次检测时,对检测点(Scale)周边多少有效点同时检测,因为可能选取的检测点大小不足而导致遗漏

minSize : 检测点的最小值,或者说就是检测点的最终值

flags : 这个参数在新版的opencv是不需要的,暂时不管了,注释掉同样可以

#5

输出检测出的人脸的个数,这里的faces的类型是

<type ‘numpy.ndarray’>

这个ndarray是一个二维数组,行数是检测出的对象的个数,每行为检测到的矩形区域的坐标(左上,右下)

#6

用矩形做标记,参数分别为图像,矩形的左上坐标,右下坐标,,,其他参数见文档:rectangle

#7

显示标记好的图像,第一个参数指定显示的窗体的标题,第二个参数就是图像的数据,这个数据其实也是

<type ‘numpy.ndarray’>

具体函数的讲解见文档:imshow

#8

这个函数决定每帧显示的时长,单位是毫秒,waitKey(0)表示这一帧在你按下任意键前始终显示,waitKey(25)表示每帧显示时长为25毫秒,之后会自动显示下一帧.

文档更新时间: 2019-06-14 13:19   作者:月影鹏鹏