标签:
简略的介绍一下 : 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毫秒,之后会自动显示下一帧.
至此,这个简短的检测人脸的脚本就结束了
标签:
原文地址:http://my.oschina.net/chinesezhx/blog/520917