先解决一个问题,为什么opencv3在python中的导入方式是import cv2?
简单的解释一下,就是这里的数字‘2’并不代表版本号,而是代表一些别的东西。想要知道opencv的版本就输入指令 print(cv2.__verson__)
顺便提示一下,opencv是以numpy模块为基础,来处理数据。
首先介绍一下处理图片的基本知识
矩阵array[[[1,0,0],
[0,0,0],
[0,0,0]],
[[2,0,0],
[0,0,0],
[0,0,0]],
[[3,0,0],
[0,0,0],
[0,0,0]]
]
此矩阵为一个三维数组,可以表示一个BGR三通道形式表示的9个像素点的图片,每个像素点一般用三个8位(二进制)的数字来表示,所以每个像素的范围是0-255的三个数字组成的。
比如图片的左上角第一个像素点的蓝色B=1(array[0,0,0]),绿色G=2(array[1,0,0]),红色R=3(array[2,0,0])。
其他的色彩表示方法和BGR的形式差不多,只是取值范围或是通道数不同而已。(提示:在学习opencv时三色表示的顺序都是BGR,而不是一般人认为的RGB,具体我也不知道为什么)
然后列出一些基本的重点函数(只介绍一些常用的参数和常用的方法,具体可以自己查资料)
1.读取和保存图片的两个函数
cv2.imread(参数1,参数2)此处的参数1为字符串,内容为想要读取的图像的文件路径。参数2为数字,不同的数字可以控制函数返回不同形式的数字矩阵。
函数的作用:读取一个图像文件,默认返回三通道的BGR的数字矩阵。可控制参数2改变返回形式。
cv2.imwrite(参数1,参数2)此处的参数1为字符串,表示想要保存的路径和文件名。参数2为某数字矩阵。
函数的作用:将一个数字矩阵转化成图片并按指定路径保存。
2.处理视频帧的一些函数(读取帧的操作往往伴随循环)
cv2.VideoCapture(参数1)此处的参数1为信号源
函数的作用:使某一视频文件或是摄像头作为帧的输入源。返回该输入源。
下面假设使用x来接收信号源,即以执行x = cv2.VideoCapture(参数1)为前提
x.read()
函数的作用:读取一帧的数据返回值有两个,依次是布尔值(判断成功与否),帧的内容。(再次调用则获取下一帧)。
x.get(参数1)此处的参数1为cv2的内置参数
函数的作用:这里介绍三个,当参数为cv2.CAP_PROP_FPS时,返回获取到的文件帧率。
当参数为cv2.CAP_PROP_WIDTH时,返回获取到的文件画面的宽。
当参数为cv2.CAP_PROP_HEIGHT时,返回获取到的文件画面的高。
cv2.VideoWrite(参数1,参数2,参数3,参数4)此处的参数1为字符串,表示保存路径及名称,参数2为cv2的内置参数编码器的不同模式,参数3为数字,表示帧率,参数4为数字,表示大小(宽高)
函数的作用:以参数1234确定的标准,返回一个即将保存的视频对象。
下面假设使用y来表示即将保存的视频对象,即以执行y = cv2.VideoWrite(参数1,参数2,参数3,参数4)为前提
y.write(参数1)此处的参数1为帧流即数字矩阵
函数的作用:将此帧写入视频对象。
y.release()
函数作用:释放摄像头。
3.管理窗口的一些函数
cv2.namedWindow(参数1)此处的参数1为字符串,表示窗口名
函数的作用:创建一个名为参数1的窗口。
cv2.imshow(参数1,参数2)此处的参数1为字符串,表示窗口名,参数2为要显示的内容(可以是图片也可以是视频或是摄像头等信号源)
函数的作用:将参数2的内容显示在名为参数1的窗口上(显示一下会立即消失,必须搭配waitkey()使用)。
cv2.destoryWindow(参数1)此处的参数1为字符串,表示要销毁的窗口名
函数的作用:将名为参数1的窗口销毁。
cv2.waitKey(参数1)此处的参数1为数字,表示等待时间,
函数的作用:当获取的键盘事件(键盘码)等于某个数值时,执行某操作。例如if cv2.waitKey(1) == 1: pass。
cv2.setMouseCallback(参数1,参数2)此处的参数1为字符串,表示绑定窗口,参数2为绑定函数的函数名
函数的作用:为名为参数1的窗口绑定鼠标事件,触发后执行参数2函数。
接着举一些例子,来实践一下这些函数
例1:读取一种格式的图像文件,然后将其保存成另一种形式
importcv2
image= cv2.imread('mypic.png')
cv2.imwrite('mypic.jpg', image)
例2:将含有随即字节的bytearray转换为灰度图和BGR图
importcv2importnumpyimportos
randomByteArray= bytearray(os.urandom(120000)) #随机生成长度为120000的字节串,再将其转化成bytearray类型
flatNumpyArray = numpy.array(randomByteArray) #再转化为numpy.array方便操作
grayImage = flatNumpyArray.reshape(300, 400) #重塑为300x400的矩阵(前高后宽)
cv2.imwrite('randomgray.png', grayImage) #保存为单通道的灰度图
bgrImage= flatNumpyArray.reshape(100, 400, 3) #保存为BGR形式
cv2.imwrite('randomcolor.png', bgrImage)
例3:视频文件的读写
importcv2
videoCapture= cv2.VideoCapture('myvideo.mp4') #获取一个视频文件的对象
fps = videoCapture.get(cv2.CAP_PROP_FPS) #获取视频的帧率
size =(int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))#获取视频画面的宽高
videoWrite = cv2.VideoWriter('Myoutput.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size) #创建一个即将写入的视频文件对象
success, frame = videoCapture.read() #获取视频文件第一帧的画面
while success: #通过循环写入创建的视频文件
videoWrite.write(frame) #写入一帧
success, frame = videoCapture.read() #读取一帧
例4:捕获摄像头的帧,并保存
importcv2
videoCapture=cv2.VideoCapture(0)
fps= 30size=(int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWrite= cv2.VideoWriter('Myoutput.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
success, frame=videoCapture.read()
num= 10 * fps - 1
while success and num >0:
videoWrite.write(frame)
success, frame=videoCapture.read()
num-= 1videoCapture.release()#原理与上例类似
例5:在窗口显示图像
importcv2
img= cv2.imread('vacation.png')
cv2.imshow('my image', img)
cv2.waitKey()
cv2.destroyAllWindows()
例6:在窗口显示摄像头的帧
importcv2
clicked=FalsedefonMouse(event, x, y, flags, param):globalclickedif event ==cv2.EVENT_LBUTTONUP:
clicked=True
cameraCapture=cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', onMouse)print('正在显示摄像头画面,按任意键停止')
success, frame=cameraCapture.read()while success and cv2.waitKey(1) == -1 and notclicked:
cv2.imshow('MyWindow', frame)
success, frame=cameraCapture.read()
cv2.destroyAllWindows()
cameraCapture.release()