python opencv 教程_Python与OpenCV人脸检测 实现基础教程图解

因为这个学期学习的Pattern Recognition需要做一个Lab实验,而我所在的小组的题目是人脸识别。我想参与做的工作是人脸检测定位,然后提取特征。

为了减少工作量,尽量采用现成的技术和现有的库,例如OpenCV。最容易实现而且已经被广泛实践的就是人脸的定位了,使用过google plus或者facebook的人都知道,在浏览相片的时候,能够自动识别人脸并且提示圈人。目前发现新浪微博的相册还无此自动识别功能,只有手动寻找位置……

人脸检测效果如下:

face0.jpeg

在Python下用起来OpenCV很爽,代码很简洁,很清晰易懂。使用的是Haar特征的分类器,训练之后得到的数据存在一个xml中。

在 http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/trunk/opencv/data/haarcascades/ 可以下载各种分类器的haar特征数据。例如人脸(正脸和侧脸),眼耳口鼻,上体或者下体等。

import sys, os

import Image

from opencv.cv import *

from opencv.highgui import *

def detectObject(image, size):

grayscale = cvCreateImage(cvSize(*size), 8, 1)

cvCvtColor(image, grayscale, CV_BGR2GRAY)

storage = cvCreateMemStorage(0)

cvClearMemStorage(storage)

cvEqualizeHist(grayscale, grayscale)

cascade = cvLoadHaarClassifierCascade('haarcascade_profileface.xml',

cvSize(1,1))

faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.1, 3,

CV_HAAR_DO_CANNY_PRUNING, cvSize(50,50))

if faces:

for i in faces:

cvRectangle(image, cvPoint( int(i.x), int(i.y)),

cvPoint(int(i.x+i.width), int(i.y+i.height)),

CV_RGB(0,255,0), 2, 8, 0)

else:

print "Faces not detected. Maybe change some parameters to test again."

def displayObject(image):

cvNamedWindow("face", 1)

cvShowImage("face", image)

cvWaitKey(0)

cvDestroyWindow("face")

def main():

# Format & size

img = Image.open(sys.argv[1])

if 900 not in img.size:

img.thumbnail((900, 900), Image.ANTIALIAS)

img.save('/tmp/face.jpg', 'JPEG')

image = cvLoadImage("/tmp/face.jpg")

detectObject(image, img.size)

displayObject(image)

if __name__ == "__main__":

main()

importsys, os

importImage

fromopencv.cvimport*

fromopencv.highguiimport*

defdetectObject(image, size):

grayscale = cvCreateImage(cvSize(*size), 8,1)

cvCvtColor(image, grayscale, CV_BGR2GRAY)

storage = cvCreateMemStorage(0)

cvClearMemStorage(storage)

cvEqualizeHist(grayscale, grayscale)

cascade = cvLoadHaarClassifierCascade('haarcascade_profileface.xml',

cvSize(1,1))

faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.1,3,

CV_HAAR_DO_CANNY_PRUNING, cvSize(50,50))

iffaces:

foriinfaces:

cvRectangle(image, cvPoint( int(i.x), int(i.y)),

cvPoint(int(i.x+i.width), int(i.y+i.height)),

CV_RGB(0,255,0),2,8,0)

else:

print"Faces not detected. Maybe change some parameters to test again."

defdisplayObject(image):

cvNamedWindow("face",1)

cvShowImage("face", image)

cvWaitKey(0)

cvDestroyWindow("face")

defmain():

# Format & size

img = Image.open(sys.argv[1])

if900notinimg.size:

img.thumbnail((900,900), Image.ANTIALIAS)

img.save('/tmp/face.jpg','JPEG')

image = cvLoadImage("/tmp/face.jpg")

detectObject(image, img.size)

displayObject(image)

if__name__ =="__main__":

main()

diplayObject函数用于创建一个窗口,输出图像用,很方便,plot一样随时查看效果。

detectObject函数用于加载haar特征数据,然后调用cvHaarDetectObjects来test。如果成功,返回一组矩形区域。在测试之前,需要将输入的图片转换成灰度图(grayscale),还需要创建一个存储空间用于存放测试结果。测试结果是动态分配内存空间的,所以无须指定大小了。

贴一些效果图:

face1.jpeg

静茹的照片都是舍友传给我测试的,他是梁静茹的忠实粉丝啊!!!

下面来张@菜汤 的,我也算是菜汤的一个粉丝吧!!!

face4.jpeg

多个人出现在同一张图片中。

2205324227-0.jpg

当然,并不是每次都能成功定位到人脸的,这个跟特征数据以及训练的参数有关,也跟测试时候参数的设置有关。例如,在做眼部的检测时,如果训练的数据都是没有戴眼镜的人,然后选取一张戴眼镜的人脸进行测试,大部分都会失败!!!如果是墨镜,那就百分之百失败了。

face10.jpeg

我有一个想法,我硬盘上的照片已经超过60G了,照片数目一定也不少。我想抽时间,写个小程序,把照片里的所有人脸都提取出来,然后采用KPCA和SVM来进行人脸识别。为什么要采用SVM呢? 因为在之前我们的小组中,曾珊同学提议的KPCA的方法效果很好,而SVM相对于其他方法可能慢一些,但是准确率很高,达到90%以上就很满意了。

face11.jpeg

以上统计的训练和测试的图像来自ORL人脸数据库 http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值