上一篇笔记:戳这里
一、引言
上一篇笔记中介绍了如何安装OpenCV以及打开一个窗口,这篇笔记中,将介绍如何如何在窗口中显示图片、保存图片和视频并利用摄像头保存录制的视频。
二、打开图片
显示图片的前提是需要一个创建好的窗口,在已经建好窗口的基础上,利用imread方法读取图片,imread方法的第一个参数为图片的路径以及文件名,可以根据需求自行选择绝对路径或相对路径,其可以处理的图片格式包括bmp、jpg、jpeg、png等几乎所有日常使用的的图片格式,第二个参数为库内提前预设的枚举变量,对应于图像的不同处理形式,分别为:cv2.IMREAD_COLOR(默认参数,读入一副彩色图片,忽略alpha通道)、 cv2.IMREAD_GRAYSCALE(读入灰度图片) 、cv2.IMREAD_UNCHANGED(读入完整图片,包括alpha通道)。Alpha是出现在 32 位位图文件中的一类数据,用于向图像中的像素指定透明度。 在第二个参数缺省的情况下,会默认读入彩色图片。图像会转变成numpy数组的形式储存。
成功读入图片后,只需用imshow方法将事先创建好的窗口与图片“绑定”在一起,即可完成显示。
import cv2
cv2.namedWindow('new',cv2.WINDOW_NORMAL) #创建窗口
cv2.resizeWindow('new',640,480)
img = cv2.imread('jinbu.jpg') #读取图片
cv2.imshow("new", img)
cv2.waitKey(0)
运行上述代码,即可在窗口中打开图片。
三、保存图片
既然可以打开图片,同样可以对处理后的图片进行保存,需要使用imwrite方法。
imwrite方法第一个参数为需要保存的路径,第二个参数为储存图像的numpy数组,下方的代码实现了打开指定的jpg图片,在按下q键后退出显示并提示,按下s键后在指定路径下保存为png格式并提示,按下其他键不作出反映。
import cv2
cv2.namedWindow('new',cv2.WINDOW_NORMAL) #创建窗口
img = cv2.imread('jinbu.jpg') #读取图片
while True:
cv2.imshow("new", img)
key = cv2.waitKey(0)
if key == ord('q'):
print("quit successfully!")
break
elif key == ord('s'):
cv2.imwrite("jinbu.png", img)
print("save successfully!")
else:
print("you press another key{}".format(key))
cv2.destroyAllWindows()
四、显示视频
视频的播放可以简单地理解为一连串的图像帧按照一定的间隔在窗口上显示。首先需要使用VideoCapture方法获取视频的来源,其参数可以为视频文件的路径,这样读入的就是视频中的一连串图片帧,当然,可以利用摄像头实时获取视频,只需将参数填写为摄像头的id就能获取摄像头的视频。值得一提的是,当前设备只有一个摄像头时,只需填0即可自动获取。这样一来,即可获取到视频资源。
#获取视频设备
cap = cv2.VideoCapture(0)
为了在窗口中进行进一步的显示,需要利用read方法获取视频中的信息,read方法的返回值有两个,第一个为当前视频的状态值,第二个为图像帧,我们需要做的是把图像帧按照图像显示的方式显示在窗口上。但与图像显示不同的是,视频需要一帧帧地进行播放,这意味着waitkey方法的参数不能再为0,我们可以指定间隔比如1(这样就会延迟1ms后切换下一帧),实现播放效果。
当然,完成视频的播放后,同样需要释放资源。
#创建窗口
cv2.namedWindow("vedio", cv2.WINDOW_NORMAL)
cv2.resizeWindow("vedio", 640, 480) #设置合适的窗口大小
#获取视频设备
cap = cv2.VideoCapture(0)
while True:
#从摄像头读取视频
ret, frame = cap.read() #会返回两个值,第一个为状态值,第二个为图像帧
cv2.imshow('vedio', frame)
key = cv2.waitKey(1)
if (key & 0xff == ord('q')):
break
#释放资源
cap.release()
cv2.destroyAllWindows()
五、录制视频
视频的录制需要创建VideoWriter为写多媒体文件,具体方法如下:
import cv2
#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG') #表示编解码的格式
vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720)) #分辨率必须与硬件匹配
#创建窗口
cv2.namedWindow('vedio',cv2.WINDOW_NORMAL)
cv2.resizeWindow('vedio',640,480)
#获取视频设备
cap = cv2.VideoCapture(0) #参数为0时会自动检测视频格式
while True:
#从摄像头读视频帧
ret, frame = cap.read() #read 会返回两个值,第一个为状态值,第二个为视频帧
cv2.imshow('vedio', frame) #展示数据
vw.write(frame)
key = cv2.waitKey(1) #这里不能一直等待,否则视频无法正常读取
if (key & 0xff == ord('q')):
break
#释放资源
cap.release() #释放VedioCaputure
vw.release() #释放VedioWriter
cv2.destroyAllWindows()