目录
MATLAB Computer Vision System Toolbox
计算机视觉基础概述
计算机视觉主要工具
OpenCV
计算机视觉领域应用最广泛的开源工具包,基于C/C++语言,支持Linux/Windows/MacOS/Android/iOS,提供了Python、MATLAB和Java等语言的接口。
MATLAB Computer Vision System Toolbox
MATLAB的视觉工具包沿袭了上手简单、可视化方便的风格。
SimpleCV
基于Python的视觉库,提供非常简单易用的接口,底层实现是基于OpenCV、PIL等其他的计算机视觉和图像处理库。
深度学习工具
TensorFlow基于数据流编程的符号数学系统,广泛应用于各类机器学习算法的编程实现。
Keras是一个深度学习的Python库,它结合了不同库的元素。
Python与计算机视觉
Python中提供了大量的计算机视觉相关的开发工具
Numpy
NumPy是Python中的核心库之一,并为数组提供支持。图像本质上是包含数据点像素值的标准NumPy数组。因此,通过使用基本的NumPy操作可以修改图像的像素值。可以使用skimage加载图像并使用Matplotlib显示。
PIL库/Pillow库
PIL(Python Imaging Library)是Python中最常用的图像处理库。Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例,可以直接载入图像文件,读取处理过的图像和通过抓取方法得到图像等方法。得到图像之后,可以对图像裁剪、粘贴和合并操作,能对图像做简单的几何变换,能对图像做色彩空间的变换,能对图像进行过滤、增强等。
Pillow 是 Python3 最常用的图像处理库,Python2 使用Pil库,两者是使用方法差不多,区别在于类的引用不同。
注意:Pil 库与 Pillow 不能同时存在与一个环境中。
OpenCV-Python
OpenCV(开源计算机视觉库)是计算机视觉应用中使用最广泛的库之一。OpenCV-Python是OpenCV的Python API。OpenCV-Python不仅速度快,因为后台由用C/C ++编写的代码组成,但它也很容易编程和部署。这使其成为执行计算密集型计算机视觉程序的绝佳选择。
OpenCV提供了对图像处理的很多基本操作,包括图像读取、对图像的各种变换操作、基本图形处理、特征提取等,另外还提供了大量的优秀算法,本书中大部分计算机视觉相关的方法都来自于OpenCV。
显示一张彩色照片
描述: 从电脑中读取一张照片,然后把他显示在窗口中。
要求:
- 掌握读取图片
- 掌握表示图片
- 掌握显示图片
- 掌握关闭窗口
引入cv2
cv2是python中提供的OpenCV库,所以首选需要引入cv2:
import cv2
读取文件
使用cv2.imread(文件名, 属性)读取图像文件,第一个参数表示图像对应的文件名,ierge参数指定图像用哪种方式打开。cv2.IMREAD_COLOR表示读入彩色图像,是默认参数。
OpenCV读取的彩色图像为BGR模式,不是RGB模式。
cv2.IMREAD_GRAYSCALE表示读入灰度图像。方法返回image对象,后续可以使用img对像操作图像。
例如读取img文件下的一个文件,img文件夹与当前项目在相同文件夹:
img = cv2.imread('img/Lenna.png')
图像的表示
通过imread方法返回彩色图像实际上是一个三维额数组,使用print(img.shape)打印类型,会输出类似下面的信息:(100,100,3),表示图像的大小是100*100,宽度和高度都是100个像素,整个图像是10000个像素,每个像素包含3个值,分别表示蓝(B)绿(G)红(R),取值范围都是0~255。
可以使用以下代码查看某个像素的3个值:
print(img[50][50])
也可以查看具体某个通道的值,下边艾玛分别显示蓝色、绿色和红色的部分值:
print(img[50][50][0]) 蓝色部分 print(img[50][50][1]) 绿色部分 print(img[50][50][2]) 红色部分 |
显示图像
cv2.imshow(窗口名, 图像) ,第一个参数表示显示图像的窗口的名字,第二个参数表示要显示的图像。
要显示图像,可以使用:
title = 'lena' cv2.imshow(title, img) |
控制窗口显示的时间
可以使用cv2.waitkey(parameter)来接收用户的键盘输入信息,参数表示窗口显示的时间,单位是毫秒,如果一直显示,可以设置parameter = NONE或0来表示。
在窗口显示的过程中,如果用户点击了键盘,窗口就关闭了。
窗口显示3秒: cv2.waitkey(3000)
一直显示图像窗口: cv2.waitkey(0)
关闭窗口
调用destroyAllWindows()方法关闭所有窗口。
cv2.destroyAllWindows()
完整代码
读取图片并显示图片的代码:
import cv2 img = cv2.imrea('lena.png') title = 'lena' cv2.imshow(title, img) cv2.waitkey(0) cv2.destroyAllWindows() |
使用Python实现视频录制
描述:使用Python语言,调用电脑自带的摄像头,录制视频信息,然后把视频保存到电脑上。
要求:
- 掌握视频与图像的关系
- 视频的常见格式
- 如何打开摄像头
- 如何读取摄像头图像
- 如何显示视频
- 如何释放摄像头
- 如何保存视频
视频与图像的关系
视频的连续的图像,包含多幅图像,并包含图像的运动信息。由于人眼识别的频率有限,所以在单位时间内看到的图像数量超过一定的数目,给人的感觉就是视频了。这个频率一般是每秒25张,通常称为25帧/秒。组成视频的每张图像也称为一帧。
视频的格式
MPEG
MPEG的英文全称为Moving Picture Experts Group,即运动图像专家组格式,常见的VCD、SVCD、DVD就是这种格式。MPEG文件格式是运动图像压缩算法的国际标准,采用的是有损压缩方法,能够减少视频中的冗余信息。MPEG的压缩方法是保留相邻两幅画面绝大多数相同的部分,而把后续图像中和前面图像有冗余的部分去除,从而达到压缩的目的。目前MPEG主要压缩标准有MPEG-1、MPEG-2、MPEG-4、MPEG-7与MPEG-21。
AVI
AVI(Audio Video Interleaved)是音频视频交错的英文缩写,将视频和音频封装在一个文件里,且允许音频同步于视频播放。1992年微软推出。这种视频格式的优点是图像质量好,可以跨多个平台使用;其缺点是体积过大,更糟糕的是压缩标准不统一。
ASF
ASF(Advanced Streaming Format)高级流格式是微软发展出来的一种可以直接在网上观看的视频文件压缩格式。
MOV
MOV即QuickTime影片格式,它是苹果公司开发的一种音频、视频文件格式,用于存储常用的数字媒体类型。当选择QuickTime(w.mov)作为保存类型时,动画将保存为.mov文件。
WMV格式
WMV(Windows Media Video)是微软推出的一种流媒体格式,是ASF格式的升级延伸。在同等视频质量下,WMV格式的体积非常小,适合在网上播放和传输。
3GP格式
3GP是“第三代合作伙伴项目”制定的一种多媒体标准,即一种3G流媒体的视频编码格式,主要是为了配合3G网络的高传输速度而开发的,也是目前手机中最为常见的一种视频格式。
RM格式与RMVB格式
RM格式是Real Networks公司制定的音频视频压缩规范,全称为Real Media。用户可以使用RealPlayer 或RealOne Player对符合Real Media技术规范的网络音频/视频资源进行实况转播,并且Real Media可以根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。RMVB格式是由RM视频格式升级而来的视频格式,它的先进之处在于RMVB视频格式打破了原先RM格式那种平均压缩采样的方式,在保证平均压缩比的基础上合理利用比特率资源。
FLV/F4V
FLV是Flash Video的简称,也是一种视频流媒体格式。由于它形成的文件较小、加载速度很快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好地使用等缺点,应用较为广泛。F4V是继FLV格式后Adobe公司推出的支持H.264的高清流媒体格式,码率最高可达50Mbps。F4V更小更清晰,更利于网络传播,已逐渐取代FLV,且已被大多数主流播放器兼容播放。
打开摄像头
VideoCapture(int)是cv2中用于获取摄像头的函数,参数表示要打开的摄像头。
打开摄像头的代码:
cap = cv2.VideoCapture(0)
该函数的参数为0表示打开笔记本的摄像头。
读取摄像头图像
VideoCapture的read方法用于读取摄像头图像:
ret, frame = cap.read()
ret表示是否读取到图片,如果是true表示读取到视频帧,如果是false表示没有读取到视频帧,frame表示读取的视频帧数据。有时候初始化摄像头可能出错了,也可以使用isOpened()方法来检查是否成功初始化了摄像头,返回值为true表示初始化成功。如果没有成功初始化,可以使用open()方法打开摄像头
显示视频
视频中的每一帧就是一副图像,所以显示视频的过程是一帧一帧来显示图像,显示图像仍然使用imshow方法,第1个参数表示显示图像的窗口的标题,第二个参数表示要显示的图像,例如下面的代码:
cv2.imshow("cap2", frame)
要显示视频,就是不断地获取视频帧,并现在在界面上,可以使用循环来实现,下面的代码实现了视频的显示。
while 1: ret, frame = cap.read() cv2.imshow("cap2", frame) if cv2.waitKey(100) & 0xff == ord('q'): break |
这里使用死循环来不停的展示图片,实际上就是视频了。如果用户在界面输入的信息,并且输入的信息是q的时候使用break退出循环。
释放摄像头
与使用其它资源一样,在使用之后需要关闭摄像头,使用release方法释放摄像头资源。
cap.release()
关闭摄像头之后,关闭窗口,使用destroyAllWindows方法关闭窗口:
cv2.destroyAllWindows()
保存视频
保存视频是在获取视频之后把视频保存到文件中。主要的过程如下:
(1)引入cv2
import cv2
(2)打开摄像头
VideoCapture(int)是cv2中用于获取摄像头的函数
cap = cv2.VideoCapture(0)
该函数的参数为0表示打开笔记本的摄像头。
(3)得到摄像头图像的大小
cap的get方法用于获取各种参数,要想获取视频图像的宽度和高度采用可以使用cv2.CAP_PROP_FRAME_WIDTH和cv2.CAP_PROP_FRAME_HEIGHT,下面的代码用于获取摄像头的大小:
sz = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
(4)设置视频的编解码器
使用VideoWriter_fourcc设置视频的编解码器,典型的参数有:
cv2.VideoWriter_fourcc('I','4','2','0'),该参数是YUV编码类型,文件名后缀为.avi; cv2.VideoWriter_fourcc('P','I','M','I'),该参数是MPEG-1编码类型,文件名后缀为.avi cv2.VideoWriter_fourcc('X','V','I','D'),该参数是MPEG-4编码类型,文件名后缀为.avi cv2.VideoWriter_fourcc('T','H','E','O'),该参数是Ogg Vorbis,文件名后缀为.ogv cv2.VideoWriter_fourcc('F','L','V','1'),该参数是Flash视频,文件名后缀为.flv cv2.VideoWriter_fourcc(*'mpeg'),该参数表示mpeg格式,文件后缀名mp4 |
(5)得到视频输出流
使用cv2.VideoWriter()函数获取视频输出流:
vout = cv2.VideoWriter()
(6)设置帧率
fps = 20
(7)创建输出文件
vout.open('d:/output.mp4',fourcc,fps,sz,True)
第一个参数表示文件存储的位置,第二个参数表示视频的编解码器类型,第三个参数表示帧率,第四个参数表示视频图像的大小,最后一个参数True表示彩色图片。
(8)把图像写入视频文件
vout.write(frame)
(9)循环采集视频并输出
cnt = 0 while cnt<2000: cnt += 1 print(cnt) _, frame = cap.read() cv2.putText(frame, str(cnt), (10, 20), cv2.FONT_HERSHEY_PLAIN, 1, (0,255,0), 1, cv2.LINE_AA) vout.write(frame) |
(10)释放摄像头
使用release方法释放摄像头:
cap.release()
(11)关闭窗口
使用destroyAllWindows方法关闭窗口:
cv2.destroyAllWindows()
(12)完整代码
如下:
# vedioTest.py #coding=utf-8 # 引入库 import cv2 # 打开摄像头 cap = cv2.VideoCapture(0) # 得到图像的大小 sz = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) # 帧率 fps = 20 # 设置编码方式 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') #fourcc = cv2.VideoWriter_fourcc('m', 'p', 'e', 'g') #fourcc = cv2.VideoWriter_fourcc(*'mpeg') # 得到视频输出流 vout = cv2.VideoWriter() # 创建文件 vout.open('d:/output.mp4',fourcc,fps,sz,True) # Cnt用于计数 cnt = 0 # while cnt<2000表示循环2000次,也就是采集2000桢。 while cnt<2000: cnt += 1 # 输出计数器 print(cnt) # cap.read()读取一帧数据, _, frame = cap.read() # cv2.putText在视频桢上输出文字, cv2.putText(frame, str(cnt), (10, 20), cv2.FONT_HERSHEY_PLAIN, 1, (0,255,0), 1, cv2.LINE_AA) # vout.write(frame)输出视频桢。 vout.write(frame) # 关闭输出流 vout.release() # 关闭摄像头 cap.release() |