python人脸识别

来源:互联网 发布:桌面图标软件 编辑:程序博客网 时间:2024/06/05 19:11

python是一种简单实用的脚本语言,实用python可以快速进行图像方面的操作,比如图片的识别,下面的教程会教你一步一步用python写出识别人脸和追踪动态物体的小程序

1.1开发环境搭建

1.1.1开发平台

Windows+Python+OpenCV

1.1.2软件包

python-2.7.13.amd64.msi

pip-9.0.1.tar

numpy-1.12.1-cp27-none-win_amd64.whl

opencv-2.4.13

pycharm-community-2016.3.3

1.1.3 安装步骤

1) Python安装包-- python-2.7.13.amd64.msi

点击下载下的python-2.7.13.amd64.msi,一路next下去,

安装完成后,配置环境变量,在path里面加入安装的python的根目录(例如 C:\Python27

进入cmd命令行,输入:python,输出python的版本信息证明python安装成功。


2)python工具包--pip-9.0.1.tar

进行解压,例如解压到了C盘根目录下。

cmd命令进入解压目录,   即  cd   C:\pip-9.0.1

执行,python  setup.py  install

3)Python科学计算-- numpy-1.12.1-cp27-none-win_amd64.whl

将该软件包拷贝到 C:\pip-9.0.1 目录下

执行命令  python pip install numpy-1.12.1-cp27-none-win_amd64.whl


4) 开源视觉库OpenCV--- opencv-2.4.13

双击运行,将其解压到C盘根目录即可

 

5) 集成开发环境-- pycharm-community-2016.3.3

双击运行,默认安装即可。

 

6)文件拷贝(通过python控制opencv的库)

源:拷贝文件C:\opencv\build\python\2.7\x64\cv2.pyd(64位的是x64,32位的是x86)

到目的地:C:\Python27\Lib\site-packages\文件夹下

2.图像处理

2.1基本图像处理

在 pycharm中新建项目,然后建立imagePro文件夹,在里面新建helloCV.py文件,然后在文件夹下新建image文件夹,放上图片。我们的第一个例子:

利用opencv处理图像

1,打开、显示、保存图片

#encoding=utf-8import cv2  #导入opencv2库img = cv2.imread("./images/beach.jpg")   #载入图片,图片路径有两种斜杠cv2.imshow("HelloCV", img)  #显示图像cv2.imwrite("D:/save1.jpg", img)#保存图片cv2.waitKey(0)  #等待用户输入键,退出


2.操作图片像素点

#encoding=utf-8import cv2img = cv2.imread("./images/beach.jpg")print img.shape #像素宽高、3L为rgb三通道print img.size#文件大小#获得某个像素点的值(b, g, r) = img[0, 0]print b, g,  r#得到一块图像,改变其颜色img[0:100, 0:100] = (0, 255, 0)cv2.imshow("100x100", img)cv2.waitKey(0)


3.在图片上画矩形

#encoding=utf-8import cv2img = cv2.imread("./images/beach.jpg")red = (0, 0, 255)   #b g rfont = cv2.FONT_HERSHEY_COMPLEX_SMALL   #字体大小cv2.putText(img, "asd", (100, 100), font, 4, red)cv2.rectangle(img, (0, 0), (200, 200), red, -1) #粗细是-1,表示实心的图形cv2.imshow("HelloCV", img)cv2.waitKey(0)


4.缩放图片

#encoding=utf-8import cv2img = cv2.imread("./images/bear.jpg")print img.shapeh = img.shape[0]w = img.shape[1]img2 = cv2.resize(img, (2*h, 2*w), interpolation=cv2.INTER_CUBIC)#放大两倍cv2.imshow("HelloCV", img2)cv2.imshow("HelloCV1", img)cv2.waitKey(0)


5.平移和旋转图片

#encoding=utf-8import cv2import numpy as ny #别名img = cv2.imread("./images/bear.jpg")w = img.shape[0]h = img.shape[1]#平移图像#创建一个变换矩阵#平移:x轴正方向(1,0) 100, y轴正方向(0,1)50M = ny.float32([[1, 0, 100], [0, 1, 50]])dst = cv2.warpAffine(img, M, (w, h))#平移图像cv2.imshow("Hello", dst)cv2.imshow("HelloCV", img)#旋转图像#创建旋转矩阵,参数为旋转中心,旋转角度,缩放比例N = cv2.getRotationMatrix2D((0.5*w, 0.5*h), 45, 0.75)dst1 = cv2.warpAffine(img, N, (w, h))cv2.imshow("HelloCV1", dst1)cv2.waitKey(0)


6.分离和合并图像通道

#encoding=utf-8import cv2img = cv2.imread("./images/baboon2.jpg")(B, G, R) = cv2.split(img)cv2.imshow("blue", B)cv2.imshow("green", G)cv2.imshow("red", R)merge = cv2.merge([B, G, R])cv2.imshow("merge", merge)cv2.waitKey(0)


7.图像边缘检测

#encoding=utf-8import cv2import numpy as np #数学工具包img = cv2.imread("./images/Lena.jpg")#边缘检测1gray =  cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   #转换为灰度图,以便运算lab = cv2.Laplacian(img, cv2.CV_64F)    #深度lab = np.uint8(np.absolute(lab))    #绝对值化cv2.imshow("laplacain", lab)#边缘检测2#canny像素值范围30到150canny = cv2.Canny(img, 30, 150)cv2.imshow("canny", canny)cv2.waitKey(0)


8.图像人脸识别

首先我们要找到opencv安装目录下的C:\opencv\build\share\OpenCV\haarcascades人脸图像库,haarcascade_frontalface_alt.xml,haarcascade_frontalface_alt2.xml,haarcascade_frontalface_alt_tree.xml这三个文件都是opencv官方的人脸图像库,我们把这三个文件复制到我们的项目中,如果检测不出来可以更换文件。

#encoding=utf-8import cv2import numpy as np #数学工具包img = cv2.imread("renlian2.jpg")#载入一张包含人脸的图片cas = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")   #载入级联分类器,即人脸数据库gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图,以便运算#检测人脸:跟数据库进行比较#结果:人脸的坐标x, y, 长度, 宽度rects = cas.detectMultiScale(gray)for x, y, width, height in rects:    cv2.rectangle(img, (x, y), (x+width, y+height), (0, 0, 255), 3)cv2.imshow("face", img)cv2.waitKey(0)


3.视频处理

3.1获取摄像头并显示图像

#encoding=utf-8import cv2#处理视频类#摄像头编号0(默认) 1 2 3camera = cv2.VideoCapture(0)    #必须要有参数,不写参数会导致读不到摄像头#python语法,用缩进表示代码块,相当于c的括号while True:    # 读取一帧图像,ret为是否读到的返回值,img为读到的图像    (ok, img) = camera.read()    if not ok:        print "open video failed"        break    else:        print "open video success"        cv2.imshow("videoCapture", img)    if cv2.waitKey(33) & 0xFF == ord('q'):#等待33毫秒,输入q跳出        breakcamera.release()cv2.destroyAllWindows()cv2.waitKey(0); #等待输入


3.2读取视频并显示视频

我们把bike.avi复制到项目中

# encoding=utf-8import cv2# 处理视频类# 参数是文件名就是读取视频文件camera = cv2.VideoCapture("bike.avi")# python语法,用缩进表示代码块,相当于c的括号while True:    # 读取一帧图像,ret为是否读到的返回值,img为读到的图像    (ok, img) = camera.read()    if not ok:        print "open video failed"        break    else:        print "open video success"        cv2.imshow("videoCapture", img)    if cv2.waitKey(33) & 0xFF == ord('q'):  # 等待33毫秒,输入q跳出        breakcamera.release()    #释放摄像头cv2.destroyAllWindows() #销毁所有设备cv2.waitKey(0);  # 等待输入


3.3保存摄像头录制的视频

# encoding=utf-8import cv2# 处理视频类# 摄像头编号0(默认) 1 2 3camera = cv2.VideoCapture(0)fps = 24.0h = int(camera.get(3))  #获取当前摄像头支持的高w = int(camera.get(4))  #获取当前摄像头支持的宽print hprint w#创建视频文件,用于保存#文件名、选择编码方式、每秒钟播放fps、视频尺寸videosave = cv2.VideoWriter("bike11.avi", -1, fps, (h,w))# python语法,用缩进表示代码块,相当于c的括号while True:    # 读取一帧图像,ret为是否读到的返回值,img为读到的图像    (ok, img) = camera.read()    if not ok:        #print "open video failed"        break    else:        #print "open video success"        videosave.write(img)        cv2.imshow("videoCapture", img)    if cv2.waitKey(33) & 0xFF == ord('q'):  # 等待33毫秒,输入q跳出        breakcamera.release()    #释放摄像头videosave.release() #释放保存句柄cv2.destroyAllWindows() #销毁所有设备cv2.waitKey(0);  # 等待输入


3.4保存视频文件

# encoding=utf-8import cv2# 处理视频类# 摄像头编号0(默认) 1 2 3camera = cv2.VideoCapture("bike.avi")#获取原视频的码率和大小fps = camera.get(cv2.cv.CV_CAP_PROP_FPS)size = (int(camera.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),        int(camera.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))#创建视频文件,用于保存#文件名、选择编码方式、每秒钟播放fps、视频尺寸#运行时会弹出让你选择压缩方式的窗口,如果录制完成之后视频的大小为0kb,#可能是编码方式不行,可以安装#Xvid试一下videosave = cv2.VideoWriter("bike22.avi", -1, fps, size)# python语法,用缩进表示代码块,相当于c的括号while True:    # 读取一帧图像,ret为是否读到的返回值,img为读到的图像    (ok, img) = camera.read()    if not ok:        #print "open video failed"        break    else:        #print "open video success"        videosave.write(img)        cv2.imshow("videoCapture", img)    if cv2.waitKey(33) & 0xFF == ord('q'):  # 等待33毫秒,输入q跳出        breakcamera.release()    #释放摄像头videosave.release() #释放保存句柄cv2.destroyAllWindows() #销毁所有设备cv2.waitKey(0);  # 等待输入


3.5动态物体的追踪

#encoding=utf-8import cv2#动态图像追踪,两张图片相减camera = cv2.VideoCapture("bike.avi")#获取原视频的码率和大小fps = camera.get(cv2.cv.CV_CAP_PROP_FPS)size = (int(camera.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),        int(camera.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))#创建视频文件,用于保存#文件名、选择编码方式、每秒钟播放fps、视频尺寸videosave = cv2.VideoWriter("readbike.avi", -1, fps, size)#初始化视频流的第一帧firstFrame = Nonewhile True:    (ok, img) = camera.read()    if not ok:        print "open video failed"        break    #调整图像的大小,转换为灰度图,进行高斯模糊(平滑)    h = img.shape[0]    w = img.shape[1]    img = cv2.resize(img, (w, h), interpolation=cv2.INTER_CUBIC)  #调整大小    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   #灰度化    gray = cv2.GaussianBlur(gray, (21, 21), 0)  #进行高斯平滑处理,图像矩阵、滤波窗口大小、标准差,取该像素周围窗口大小内像素的平均值    #如果是第一帧    if firstFrame is None:        firstFrame = gray   #初始背景图    #计算当前帧与背景图的不同    frameData = cv2.absdiff(firstFrame, gray)    #进行二值化处理,如果像素小于阈值25,就变成0,大于阈值变成255,    thresh = cv2.threshold(frameData, 25, 255, cv2.THRESH_BINARY)[1]    #膨胀:扩展阈值图像 填充孔洞    thresh = cv2.dilate(thresh, None, iterations=2)    #在阈值图像上寻找轮廓    (cnts, ret) = cv2.findContours(thresh.copy(),                                   cv2.RETR_EXTERNAL,                                   cv2.CHAIN_APPROX_SIMPLE)    #遍历轮廓    for c in cnts:        #计算轮廓大小,忽略掉小于500的        if cv2.contourArea(c) < 100:            continue        #计算轮廓的边界框,在当前帧中绘制        (x, y, w, h) = cv2.boundingRect(c)        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3)    cv2.imshow("readMove", img)    cv2.imshow("thresh", thresh)    cv2.imshow("frameData", frameData)    videosave.write(img)    if cv2.waitKey(33) & 0xFF == ord('q'):        breakcamera.release()cv2.destroyAllWindows()cv2.waitKey(0); #等待输入


 

 

 

0 0
原创粉丝点击