软件环境
本系列文章中所提到的接口及代码在以下环境中得到过验证:
Python == 3.8.5
opencv-contrib-python == 4.5.5.64
前言
OpenCV的imread()、imwrite()、imshow()函数分别用于读写和显示图像。VideoCapture类和VideoWriter类提供了视频处理能力,支持各种格式的视频文件。
截取官方文档对该部分的描述如下:查看原文
计算机在处理图像信息时,将灰度处理为256级(0~255),0表示黑色,255表示白色,用一个字节来存储一个像素值。OpenCV使用单通道的二维数组来表示灰度图像。对于彩色通道,颜色的表示方法有所不同,可以根据公式相互转化。例如R、G、B通道,用3个通道的像素组合表示彩色图像。在OpenCV中可以对图像的彩色通道进行拆分和合并(需要注意的是OpenCV默认的图像格式为BGR)。
读、写、显示图像
提供一张图片供测试,右键图片另存为成test.jpg
1、读取彩色图像并进行显示
import cv2
image1 = cv2.imread('test.jpg',cv2.IMREAD_COLOR) # 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志
image2 = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE) # 以灰度模式加载图像
image3 = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED) # 加载图像,包括alpha通道
cv2.imshow("IMREAD_COLOR",image1)
cv2.imshow("IMREAD_GRAYSCALE",image2)
cv2.imshow("IMREAD_UNCHANGED",image3)
cv2.waitKey()
结果:
2、加载、保存、显示彩色图像
import cv2
image1 = cv2.imread('test.jpg',cv2.IMREAD_COLOR) # 加载彩色图像
cv2.imwrite('test1.jpg',image1) # 保存图像
cv2.imshow("IMREAD_COLOR",image1) # 显示图像
cv2.waitKey()
3、使用imread()读取RGB图像,利用 matplotlib.pyplot显示图像
注:Matplotlib 是一个 Python 的 2D绘图库,常用于绘制数学图表
import cv2
import matplotlib.pyplot as plt
image = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换颜色通道
plt.imshow(image)
plt.axis('off')
plt.show()
读、写、播放视频
视频处理的一般步骤如下:
(1) 将视频文件或摄像头作为数据来源来创建VideoCapture对象。
(2) 调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像。
(3)调用VideoWriter对象的writer()方法将帧写入视频文件,或者调用cv2.imshow()函数在窗口中显示帧(即播放视频)。
1、从视频文件获取图像数据,并在窗口中展示
import cv2
capture = cv2.VideoCapture('test.mp4') # 读取视频文件
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
print("frame width(宽): {}".format(frame_width))
print("frame height(高): {}".format(frame_height))
print("frames per second(帧FPS): {}".format(fps))
if capture.isOpened() is False: # 判断摄像头是否打开 capture.isOpened() --> 返回True or False
print('CAMERA ERROR !')
while capture.isOpened():
ret, frame = capture.read() # 通过摄像头,一帧一帧的捕获,返回一个布尔值(True/False),捕获每一帧(每一张照片)
if ret is True: # ret读取成功为True、读取失败为False --> 本地视频文件读取完成后关闭(brake)视频
cv2.imshow('FRAME', frame) # 显示捕获的帧
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将捕获的帧转化为灰度的帧
cv2.imshow('GRAY FRAME', gray_frame) # 显示灰度的帧
k = cv2.waitKey(1)
if k == ord('q'):
break
else:
break
capture.release()
cv2.destroyAllWindows()
2、读取彩色视频文件,从100帧开始保存为灰度视频文件
import cv2
# 读取彩色视频文件,从100帧开始保存为灰度视频文件
capture = cv2.VideoCapture('test.mp4')
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
capture.set(cv2.CAP_PROP_POS_FRAMES,100) # 从第100帧开始读取
if capture.isOpened() is False:
print("Camera Error")
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter('test_out.mp4', fourcc, int(fps), (int(frame_width),int(frame_height)), False)
while capture.isOpened():
ret, frame = capture.read()
if ret is True:
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
output_gray.write(gray_frame)
cv2.imshow('Gray',gray_frame)
k = cv2.waitKey(1)
if k == ord('s'):
break
else:
break
capture.release()
output_gray.release()
cv2.destroyAllWindows()
3、API介绍
(1)从视频文件、图像序列或摄像机捕获视频
如果是从视频文件中读取视频:
capture = cv2.VideoCapture('test.mp4') # 读取视频文件
如果是从摄像头读取视频:
capture = cv2.VideoCapture(0) # 0一般代表笔记本自带的摄像头,不同的数字代表不同的摄像头
(2)获取视频流的参数信息
在官方文档中罗列了所有支持获取到的参数信息,下面的例子是获取视频流中帧的宽度与高度:
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
注:在部分场景下,所获取到的视频流信息不一定准确,使用过程中需要留意。
(3)设置视频流的参数
在官方文档中罗列了可能的参数,但是不是所有参数都是支持设置的。
下面的示例是让视频流从(视频文件)第100帧的时候开始读取:
capture.set(cv2.CAP_PROP_POS_FRAMES,100) # 从第100帧开始读取
注:以上示例的操作是会耗费一定时间的,使用时请注意(耗时与所设置的帧数有关,有机会另外写文章进行介绍)
(4)读取视频帧
以下操作为抓取、解码并返回下一个视频帧:
# The method/function combines VideoCapture::grab() and VideoCapture::retrieve() in one call.
ret, frame = capture.read()
😄如果只是想跳帧(即只抓取,不解码),使用下面的操作速度更快:
# 该方法/函数从视频文件或摄像机中抓取下一帧,并在成功的情况下返回 true(非零)。
ret = capture.grab()
引用
官方接口文档:https://docs.opencv.org/4.5.5/d6/d00/tutorial_py_root.html 【OpenCV-Python】3.OpenCV的图像基础操作: