在python环境下利用opencv实现人脸识别,接下来一步一步动手操作。
预备知识
1,人脸识别,其实就是对脸部特征可以使用矩阵来描述,通过灰度图片部分特征的值的变化来确定,如:眼睛的区域大小、颜色、颜色的深浅等。
2,为啥要用opencv?opencv其实只是一个算法库,它提供了读取图片,灰度转换,显示图像,简单的编辑图像等等(android自带了一个阉割版的opencv,可以用来做人脸识别、或者类似抖音那种视频效果))。噢。其实这只是它的九牛一毛,他还有很多其他的功能,这里我们只是做个了解,以后还是会研究下这个库。
一、环境准备
如果已经准备好了请跳过。
IDE:pycharm 编辑python比较方便
如果是Anaconda,请另百度。
下载安装python3.6(我测试的是这个版本,其他版本后续可以试试,但是这个版本还是很稳定的,推荐);
下载安装python环境的opencv:
0,第一步安装numpy和Matplotlib
pip install --upgrade setuptools
pip install numpy Matplotlib
1,pip安装,需要网络较好
pip install opencv-python
2,下载安装包本地安装,使用网络不好的。先在https://www.lfd.uci.edu/~gohlke/pythonlibs/下载contrib版本,
opencv_python‑3.3.0+contrib‑cp36‑cp36m‑win_amd64.whl
pip install 安装包路径(如:d:\python\opencv_python‑3.3.0+contrib‑cp36‑cp36m‑win_amd64.whl)
3,测试
import cv2 #导入cv2模块就是opencv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
imgurl = 'bb.jpg'#本地图片路径
img = cv2.imread(imgurl) #注意这里的路径
#创建窗口并显示图像
cv2.namedWindow("Image",0)
cv2.resizeWindow("Image", 320,320);
cv2.imshow("Image",img) #显示图片
cv2.waitKey(0)
#释放窗口
cv2.destroyAllWindows()
OK,搞定!
二、代码,直接看代码,有注释
import cv2 #导入cv2模块就是opencv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
imgurl = 'bb.jpg'#本地图片路径
# imgurl = '5903040bf4146.jpg'
img = cv2.imread(imgurl) #注意这里的路径
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转化灰度图片,用于提取脸部特征值
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml') #github上共享的已训练好的通用人脸数据集
# 探测图片中的人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor = 1.15,
minNeighbors = 5,
minSize = (5,5)
)
print("发现{0}个人脸".format(len(faces)))
for(x,y,w,h) in faces:
#cv2.rectangle(img,(x,y),(x+w,y+w),(255,255,0),2)#给识别的人脸画一个矩形
cv2.circle(img,((x+x+w)//2,(y+y+h)//2),w//2,(255,255,0),2) #给识别的人脸画一个圆形
#创建窗口并显示图像
cv2.namedWindow("Image",0)
cv2.resizeWindow("Image", 320,320);
cv2.imshow("Image",img) #显示图片
cv2.waitKey(0)
#释放窗口
cv2.destroyAllWindows()
1,训练数据集地址:https://github.com/opencv/opencv/tree/master/data/haarcascades
三、运行结果
四、后续优化列表
现阶段的只是识别出人脸并画一个圆圈,识别率不高,而且光线暗淡的时候更是识别不出来,再者还不能做到识别自己的脸,所以提出以下几个优化进度。
1,训练识别人脸,提高识别率
2,尽可能地优化和改进在光线暗淡时的识别效果
3,增加前端和接口做成一个工具,提供训练的入口,达到可以识别自己,甚至对接其他工具