赞
踩
1、安装python3.6
2、安装pycharm --社区版是免费的
3、安装opencv-python、numpy 库
打开file->settings
安装即可
同样的方法安装 numpy
4、程序讲解
import cv2 import numpy as np
导入需要的库
cap = cv2.VideoCapture(0)
使用opencv自带的VideoCapture()函数定义摄像头对象,其参数0表示第一个摄像头,一般就是笔记本的内建摄像头。此函数还可以传递一个视频,只需将参数改为视频路径,就可以打开一个视频对象。
color = (0, 255, 0)
颜色由RGB三种元素组成,在python中储存格式是元组的的形式,这是为我们接下来识别人脸并用方框圈出这一步,定义方框的颜色
classfier = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") 这是一个人脸特征分类器,是社区开源的, 我们只需要打开这个人脸分类器并创建一个识别模型
while(True): # 指定图片的人脸识别然后存储 i = 0 ret , img = cap.read() grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) if len(faceRects) > 0: # 大于0则检测到人脸 for faceRect in faceRects: # 单独框出每一张人脸 i = i + 1 x, y, w, h = faceRect scr = img[x - 10 :x + w + 10 , y - 10 :y + h + 10 ] cv2.imwrite('img' + str(i) + '.jpg', scr) cv2.rectangle(img, (x , y - 10), (x + w + 10, y + h + 10), color, 3) # 5控制绿色框的粗细
1>首先在一个while循环中不断地获取摄像头的每一帧图像
cap.read()会返回两个值ret, frame。其中ret是布尔值,如果读取帧是正确的则返回True,
如果文件读取到结尾,它的返回值就为False。
frame就是每一帧的图像,是个三维矩阵。
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
我们生活中大多数看到的彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:
C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
参数解释:
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细将
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定
cv2.COLOR_BGR2GRAY:灰度图 其余的自行百度
3> faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
grey:要识别的图像数据(即使不转换成灰度也能识别,但是灰度图可以降低计算强度,因为检测的依据是哈尔特征,转换后每个点的RGB数据变成了一维的灰度,这样计算强度就减少很多)
scaleFactor:图像缩放比例,可以理解为同一个物体与相机距离不同,其大小亦不同,必须将其缩放到一定大小才方便识别,该参数指定每次缩放的比例
minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏
minSize:特征检测点的最小值
4>if len(faceRects) > 0: # 大于0则检测到人脸 for faceRect in faceRects: # 单独框出每一张人脸 i = i + 1 x, y, w, h = faceRect scr = img[x - 10 :x + w + 10 , y - 10 :y + h + 10 ] cv2.imwrite('img' + str(i) + '.jpg', scr) cv2.rectangle(img, (x , y - 10), (x + w + 10, y + h + 10), color, 3) # 5控制绿色框的粗细
返回参数是一个元组,有四个参数 x,y,w,h
x,y是检测到的人脸的轮廓的开始坐标,
w,h是轮廓的的宽度和高度
scr = img[x - 10 :x + w + 10 , y - 10 :y + h + 10 ] cv2.imwrite('img' + str(i) + '.jpg', scr)
利用矩阵切片把图片中的人脸轮廓截取下来并保存到工作目录中
cv2.rectangle(img, (x , y - 10), (x + w + 10, y + h + 10), color, 3) # 5控制绿色框的粗细
要画一个长方形,我们只需要定位其起点坐标和终点坐标
cv2.imshow("face",img)
if(cv2.waitKey(47)&0xff == 27): break if(cv2.waitKey(47) == ord('s')): cv2.imwrite('./aaa.jpg', img) break (在imshow函数后面一定要有keywait函数,否则会出错)
显示图像并设置按键 按Esc退出循环
按S保存图像
cap.release() cv2.destroyAllWindows()
释放资源并关闭窗口
效果图:
关注微信公众号:learner学编程
回复6.2 可得程序源码及人脸分类器XML(多种)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。