目录
- 图像入门
- 读取图像
- 显示图像
- 写入图像
- 示例
- 视频入门
- 从相机中读取视频
- 从文件播放视频
- 保存视频
图像入门
读取图像
使用cv.imread()
函数读取图像,图像应在工作目录或者图像的完整路径应给出;第二个参数是一个标志,它指定了读取图像的方式,有以下三种: cv.IMREAD_COLOR
:加载彩色图像,任何图像的透明度都会被忽视,为默认标志,或传入整数1 cv.IMREAD_GRAYSCALE
:以灰度模式加载图像,或传入0 cv.IMREAD_UNCHANGED
:加载图像,包括alpha通道,或传入-1
读取图像时,若图像路径错误,不会引发错误,但print img
会给出 None
显示图像
使用cv.imshow()
函数在窗口中显示图像,窗口自动适合图像尺寸。第一个参数为字符串,表示窗口名称,可根据需要使用不同的窗口名称创建任意多个窗口;第二个参数为要显示的对象。
写入图像
使用 cv.imwrite()
函数保存图像。第一个参数为文件名,第二个参数为要保存的图像。
示例
import cv2 as cv
from matplotlib import pyplot as plt
#加载彩色灰度图像
img0 = cv.imread('./test.jpg', 0)
#加载彩色图像
img1 = cv.imread('./test.jpg', 1)
#加载图像,包括alpha通道
img2 = cv.imread('./test.jpg', -1)
cv.namedWindow('Grayimage',cv.WINDOW_NORMAL) #指定窗口可调整大小
cv.imshow('Grayimage', img0)
cv.imshow('Colorimage', img1)
cv.imshow('Alpimage', img2)
plt.imshow(img0, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) #隐藏x轴和y轴上的刻度值
plt.show()
plt.imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))
plt.show()
# cv.waitKey(1)
k = cv.waitKey(0) & 0xFF
if k == 27: #等待按ESC键直接退出
cv.destroyAllWindows() #销毁创建的所有窗口
elif k == ord('s'): #等待按s保存和退出
cv.imwrite('./0530/gray.jpg', img0)
cv.imwrite('./0530/color.jpg', img1)
cv.imwrite('./0530/alpha.jpg', img2)
cv.destroyAllWindows()
cv.waitKey()
是一个键盘绑定函数,其参数是以毫秒为单位的时间,等待任何键盘事件指定的毫秒。若在参数时间内按下任何键,程序将继续运行。若参数传递0,将无限期的等待一次敲击键。
可通过cv.namedWindow()
实现创建一个空窗口,然后将图像加载到该窗口,其第二个参数为一个标志,默认为cv.WINDOW_AUTOSIZE
,若将标志指定为cv.WINDOW_NORMAL
,可调整窗口大小,当图像尺寸过大及向窗口添加跟踪栏时,很有用处。
可使用cv.destoryWindow()
函数,传递窗口名称为参数,销毁特定的窗口。
Matplotlib是Python的绘图库,可用其显示、缩放、保存图像等。Matplotlib以RGB模式显示,而OpenCV加载的彩色图像处于BGR模式,若使用OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像。可使用cv.cvtColor(img1, cv.COLOR_BGR2RGB)
进行转换
视频入门
从相机中读取视频
捕获视频,需创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称;设备索引是指定哪个摄像头的数字(从0开始),如传递1选择第二个相机。
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
#逐帧捕获
ret, frame = cap.read()
#正确读取帧,ret为True
if not ret:
print("Can't receive frame(stream end?). Exiting")
break
# gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
#显示结果帧
# cv.imshow('grayframe', gray) #灰度
cv.imshow('capFrame', frame)
if cv.waitKey(1) == ord('q'):
break
#完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()
cap有时可能尚未初始化捕获,可通过cap.isOpened()
方法检查其是否已初始化,若为false,则使用cap.open()
打开它。
可使用cap.get(propId)
方法访问该视频的某些功能,propId是0到18之间的整数,每个整数表示视频的属性(如果适用于该视频);其中一些值可以使用cap.set(propId, value)
进行修改,value为修改后的新值。
从文件播放视频
与从相机捕获方法相同,用视频文件名(.avi格式文件)更改摄像机索引。在显示框架时,使用适当的值传入cv.waitKey()
,值太小,视频将非常快;值太大,视频很慢。正常情况25就可以。
import cv2 as cv
cap = cv.VideoCapture('./video/my.avi')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame(stream end?).Exiting")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('fileFrame', gray)
if cv.waitKey(25) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
注意:确保安装了正确的 ffmpeg 或 gstreamer 版本。有时,使用视频捕获(Video Capture)是一件令人头疼的事情,主要原因是错误地安装了 ffmpeg / gstreamer
保存视频
创建一个VideoWriter
对象。指定输出文件名(如output.avi);接着指定FourCC代码;然后传递帧率的数量和帧大小;最后一个是颜色标志,若为True,编码器期望颜色帧,否则它与灰度帧一起工作。
FourCC:是用于指定视频编解码器的4字节代码。
import cv2 as cv
cap = cv.VideoCapture(0)
#定义编解码器并创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('./video/my.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame(stream end?).Exiting")
break
# frame = cv.flip(frame, 0) #0表示绕X轴(垂直)翻转
frame = cv.flip(frame, 1) #大于0表示绕Y轴(水平)翻转
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
out.release()
cv.destroyAllWindows()
摄像头捕获的帧,使用cv.flip(src: Mat, flipCode, dst: Mat = ...)
进行翻转,filpCode是控制翻转的标志,其小于0时,是同时绕两个轴进行翻转。上述代码可翻转每一帧并保存