1 图片操作
读取展示与保存
这段代码通过以下步骤实现读取图像、展示图像和保存图像:
-
cv.imread:读取图像。
-
cv.imshow:展示图像。
-
cv.waitKey:等待键盘输入。
-
cv.imwrite:保存图像。
OpenCV支持多种图像格式,包括bmp、pbm、pgm、ppm、sr和ras等。如果使用插件(如果自己构建库,需要指定使用它们,但在提供的包中,默认包含这些插件),还可以加载jpeg、jpg、jpe、jp2(在CMake中称为Jasper)、tiff、tif和png等格式的图像。此外,OpenEXR也是一个可用的选项。
操作代码
读取展示与保存
# 1 图片操作
# 1.1 读取图片并展示图片
import sys
img = cv.imread(cv.samples.findFile("OpenCV/test.jpg"))#使用imread函数读取图片
if img is None:
sys.exit("Could not read the image.")
cv.imshow("Display window", img)
k = cv.waitKey(0)#等待键盘输入,0表示无限等待,1表示等待1ms
if k == ord("s"):
cv.imwrite("starry_night.png", img)#保存图片,第一个参数是保存的文件名,第二个参数是图片对象
2 视频操作
视频读取
-
创建VideoCapture对象:为了从相机捕获视频,需要创建一个VideoCapture对象。对象的参数可以是设备索引或视频文件的名称。
-
指定设备索引:设备索引用于指定使用的相机。如果只连接了一个相机,可以通过传递0或-1来指定它。若要使用第二个相机,则传递1,以此类推。
-
逐帧捕获:创建VideoCapture对象后,可以逐帧捕获视频内容。
-
释放捕获资源:视频捕获完成后,需要调用VideoCapture对象的release方法来释放捕获资源。
读取代码
视频读取
# 2.1 读取视频并展示视频
import numpy as np
cap = cv.VideoCapture(0)#打开摄像头
# cap = cv.VideoCapture(cv.samples.findFile("OpenCV/test.mp4"))#打开视频文件,
# cap = cv.VideoCapture("OpenCV/test.mp4")#打开视频文件
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()#读取视频帧,ret表示是否读取成功,frame表示读取的视频帧
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)#将视频帧转换为灰度图
# cv.imshow("frame", frame)#展示彩色图
cv.imshow("frame", gray)#展示灰度图
if cv.waitKey(1) == ord("q"):#按q退出
break
cap.release()#释放摄像头
cv.destroyAllWindows()#关闭窗口
视频保存
-
创建VideoWriter对象:首先,需要创建一个VideoWriter对象,用于将视频帧保存为视频文件。
-
指定输出文件名:例如output.avi,这是保存视频的文件名。
-
指定FourCC代码:这是一个4字节的代码,用来指定视频编解码器。例如,使用cv.VideoWriter_fourcc(‘M’, ‘J’, ‘P’, ‘G’)或cv.VideoWriter_fourcc(*‘MJPG’)来指定MJPG编解码器。
-
设置帧率(fps):视频每秒的帧数,影响视频的流畅度。
-
设置帧大小:视频帧的尺寸,例如(640, 480),即视频的分辨率。
-
保存视频:在循环中,使用out.write(frame)将处理后的帧写入到VideoWriter对象中,从而保存视频。
代码例子
视频保存
# 2.2 保存视频
cap = cv.VideoCapture(0)#打开摄像头
fourcc = cv.VideoWriter_fourcc(*"mp4v")#设置视频编码格式
out = cv.VideoWriter("output.mp4", fourcc, 25.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, 1)#翻转视频帧
out.write(frame)#写入视频帧
cv.imshow("frame", frame)
if cv.waitKey(1) == ord("q"):
break
cap.release()
out.release()
cv.destroyAllWindows()
数组重组