python使用opencv3 01 入门函数基础(根据《opencv3 计算机视觉 python语言实现》总结)
先解决一个问题,为什么opencv3在python中的导入方式是import cv2?
简单的解释一下,就是这里的数字‘2’并不代表版本号,而是代表一些别的东西。想要知道opencv的版本就输入指令 print(cv2.__verson__)
我在网上找到了原文 https://blog.csdn.net/saltriver/article/details/78166046
顺便提示一下,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:读取一种格式的图像文件,然后将其保存成另一种形式
import cv2
image = cv2.imread('mypic.png') cv2.imwrite('mypic.jpg', image)
例2:将含有随即字节的bytearray转换为灰度图和BGR图
import cv2 import numpy import os 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:视频文件的读写
import cv2 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:捕获摄像头的帧,并保存
import cv2 videoCapture = cv2.VideoCapture(0) fps = 30 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() num = 10 * fps - 1 while success and num > 0: videoWrite.write(frame) success, frame = videoCapture.read() num -= 1 videoCapture.release() #原理与上例类似
例5:在窗口显示图像
import cv2 img = cv2.imread('vacation.png') cv2.imshow('my image', img) cv2.waitKey() cv2.destroyAllWindows()
例6:在窗口显示摄像头的帧
import cv2 clicked = False def onMouse(event, x, y, flags, param): global clicked if 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 not clicked: cv2.imshow('MyWindow', frame) success, frame = cameraCapture.read() cv2.destroyAllWindows() cameraCapture.release()