python是一种简单实用的脚本语言,实用python可以快速进行图像方面的操作,比如图片的识别,下面的教程会教你一步一步用python写出识别人脸和追踪动态物体的小程序
Windows+Python+OpenCV
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) 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增加或者替换即可。
在 pycharm中新建项目,然后建立imagePro文件夹,在里面新建helloCV.py文件,然后在文件夹下新建image文件夹,放上图片。我们的第一个例子:
利用opencv处理图像
#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) #等待用户输入键,退出
#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)
#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)
#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)
#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)
#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)
#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)
首先我们要找到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)
跟上面使用单张图像识别出人脸一样,只不过需要开摄像头,对摄像头读取到的每一帧图像进行人脸识别并显示。
# 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); # 等待输入
#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); #等待输入
我们把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); # 等待输入
# 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); # 等待输入
# 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); # 等待输入
#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的版本不对所导致的。