python人脸识别

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\文件夹下

注意:若出现IDE中import cv2错误的情况,请检查项目的python解释器路径是否正确,即确认执行您python 程序的python.exe是否可以引用到您拷贝的文件,在settings-找到你的项目-点击Project Interpreter增加或者替换即可。

2.图像处理

2.1基本图像处理

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

利用opencv处理图像

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

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

 

2.操作图片像素点

 

#encoding=utf-8
import cv2

img = 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-8
import cv2
img = cv2.imread("./images/beach.jpg")
red = (0, 0, 255)   #b g r
font = 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-8
import cv2
img = cv2.imread("./images/bear.jpg")
print img.shape
h = 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-8
import cv2
import numpy as ny #别名
img = cv2.imread("./images/bear.jpg")
w = img.shape[0]
h = img.shape[1]
#平移图像
#创建一个变换矩阵
#平移:x轴正方向(1,0) 100, y轴正方向(0,1)50
M = 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-8
import cv2
img = 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-8
import cv2
import numpy as np #数学工具包

img = cv2.imread("./images/Lena.jpg")
#边缘检测1
gray =  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到150
canny = 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-8
import cv2
import 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)

 

9.视频人脸识别

跟上面使用单张图像识别出人脸一样,只不过需要开摄像头,对摄像头读取到的每一帧图像进行人脸识别并显示。

# encoding=utf-8
import cv2

# 处理视频类
# 摄像头编号0(默认) 1 2 3
camera = 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"

        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)

    if cv2.waitKey(33) & 0xFF == ord('q'):  # 等待33毫秒,输入q跳出
        break

camera.release()
cv2.destroyAllWindows()

cv2.waitKey(0);  # 等待输入

 

 

 

3.视频处理

3.1获取摄像头并显示图像

 

#encoding=utf-8
import cv2

#处理视频类
#摄像头编号0(默认) 1 2 3
camera = 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跳出
        break

camera.release()
cv2.destroyAllWindows()

cv2.waitKey(0); #等待输入

 

 

 

 

 

3.2读取视频并显示视频

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

 

# encoding=utf-8
import 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跳出
        break

camera.release()    #释放摄像头
cv2.destroyAllWindows() #销毁所有设备

cv2.waitKey(0);  # 等待输入

 

 

 

 

 

3.3保存摄像头录制的视频

 

# encoding=utf-8
import cv2

# 处理视频类
# 摄像头编号0(默认) 1 2 3
camera = cv2.VideoCapture(0)

fps = 24.0
h = int(camera.get(3))  #获取当前摄像头支持的高
w = int(camera.get(4))  #获取当前摄像头支持的宽
print h
print 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跳出
        break

camera.release()    #释放摄像头
videosave.release() #释放保存句柄
cv2.destroyAllWindows() #销毁所有设备

cv2.waitKey(0);  # 等待输入

 

 

 

 

 

3.4保存视频文件

 

# encoding=utf-8
import cv2

# 处理视频类
# 摄像头编号0(默认) 1 2 3
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、视频尺寸
#运行时会弹出让你选择压缩方式的窗口,如果录制完成之后视频的大小为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跳出
        break

camera.release()    #释放摄像头
videosave.release() #释放保存句柄
cv2.destroyAllWindows() #销毁所有设备

cv2.waitKey(0);  # 等待输入

 

 

 

 

 

3.5动态物体的追踪

 

#encoding=utf-8
import 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 = None

while 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'):
        break

camera.release()
cv2.destroyAllWindows()

cv2.waitKey(0); #等待输入

 

 

 

 

 

 

注:

如果有报错问题,多半是python或者opencv的版本不对所导致的。

 

你可能感兴趣的:(c/c++)