Opencv-Python学习笔记(三) 第二章 Opencv的GUI特性(2)


此文档为本人(初学)主要参考由段力辉翻译的OpenCV-Python中文教程官方教程,并结合多方资料总结成学习笔记,如有侵权请联系本人

第二章 Opencv的GUI特性(2)

2.2 对视频的操作

目标:

  • 学会读取视频文件,显示视频,保存视频文件
  • 学会从摄像头获取并显示视频
  • 学习函数:cv2.VideoCapture(),cv2.VideoWriter()

2.2.1 用摄像头捕获视频

函数解析:

  • VideoCapture(flag)——读取视频
      flag:
       • 参数可以是设备的索引号,设备索引号就是在指定要使用的摄像头,一般的笔记本电脑都有内置摄像头,所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。
       • 参数可以是一个视频文件,写入视频文件的路径
  • VideoWriter(src, fourcc, fps, frameSize[, isColor])——保存视频文件
     src:要保存的文件的路径
     fourcc1:fourcc 指定编码器
     fps:要保存的视频的帧率
     frameSize:要保存的文件的画面尺寸
     [,isColor]:True表示彩色图,False表示灰度图

实战演练:
 示例一:捕获用摄像头返回视频得到的一帧一帧图片

import cv2 as cv 
capture = cv.VideoCapture(0)#打开摄像头
while capture.isOpened():#只要没跳出循环,则会循环播放每一帧图片
#capture.isOpened()检查摄像头是否成功初始化,如果返回值是True,表示摄像头正常打开,如果是False,表示摄像头打开失败,需要使用capture.open()
	print("摄像头初始化成功")
	ret,frame = capture.read()
	#read()函数读取视频(摄像头)的某帧,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表是否读到图片,第二个参数是frame,表示当前截取的一帧图片
	frame=cv.flip(frame,1)
	#翻转图像  0:沿X轴翻转(垂直翻转)   大于0:沿Y轴翻转(水平翻转)   小于0:先沿X轴翻转,再沿Y轴翻转,等价于旋转180°
	cv.imshow("VIDEO",frame)
	if cv.waitKey(1) == 27 :#27表示ESC
		capture.release()#capture.release()表示停止捕获视频
		cv.destroyAllWindows()
		break
print("摄像头初始化失败")		

 显示结果如下:
1
其余函数解析:

  • capture.read()返回两个参数,第一个参数ret表示布尔值(True/False),如果帧读取正确,返回True。可通过检查它的返回值来查看视频文件是否已经到了结尾。第二个参数frame表示当前帧,用于图像操作。
  • capture.isOpened()返回布尔值(True/False)。如果摄像头初始化正确,返回True,可用来检查摄像头是否正确打开。
  • capture.open()在摄像头初始化失败时使用,可打开摄像头。
  • capture.release()用来释放(关闭)摄像头
  • VideoCapture.get()【补充】可获得视频的一些参数信息,部分可通过 capture.set(propId,value) 修改
    OpenCV VideoCapture.get()参数详解

 示例二:读入视频文件

import cv2 as cv 
capture = cv.VideoCapture(r"D:\Demons_Working\Robomaster\视觉组\opencv\视觉素材\2.MOV")#读入视频文件
while True:#只要没跳出循环,则会循环播放每一帧图片
#capture.isOpened()检查摄像头是否成功初始化,如果返回值是True,表示摄像头正常打开,如果是False,表示摄像头打开失败,需要使用capture.open()
	ret,frame = capture.read()
	#read()函数读取视频(摄像头)的某帧,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表是否读到图片,第二个参数是frame,表示当前截取的一帧图片
	frame=cv.flip(frame,1)
	#翻转图像  0:沿X轴翻转(垂直翻转)   大于0:沿Y轴翻转(水平翻转)   小于0:先沿X轴翻转,再沿Y轴翻转,等价于旋转180°
	cv.namedWindow("VIDEO",cv.WINDOW_NORMAL)
	cv.imshow("VIDEO",frame)
	if cv.waitKey(1) == 27 :#27表示ESC
	#waitKey(1)表示间隔1ms,这里相当于加快视频播放速度
		print("终止播放")
		break
capture.release()#capture.release()表示停止捕获视频
cv.destroyAllWindows()	

 显示结果如下:
2
与从摄像头中捕获一样,你只需要把设备索引号改成视频文件的名字。在播放每一帧时,使用 cv2.waiKey() 设置适当的持续时间。如果设置的太低视频就会播放的非常快,如果设置的太高就会播放的很慢(你可以使用这种方法 控制视频的播放速度)。通常情况下 25 毫秒就可以了。

 示例三:保存视频

import cv2 as cv
capture = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID')#使用XVID编码器
out = cv.VideoWriter(r"D:\Demons_Working\Image&Video\Video\save_video.avi",fourcc,20.0,(640,480),True)
#从左至右分别是:文件保存路径、编码器、帧率、视频宽高、彩色图
while capture.isOpened():
	ret,frame = capture.read()
	if ret == True:
		frame = cv.flip(frame,1)
		cv.imshow("VIDEO",frame)
		out.write(frame)
		if cv.waitKey(1) == 27:
			break
	else:
		break
capture.release()#释放摄像头
out.release()#停止写入视频
cv.destroyAllWindows()
#释放内存

 显示结果如下:
在这里插入图片描述
其余函数解析:

  • cv.flip() 函数用来翻转一帧图像,他需要两个参数,第一个参数是要翻转的图像,第二个参数是翻转的模式(0代表按沿 x 轴翻转,整数(比如1)代表按 y 轴翻转,负数代表沿两个坐标轴同时翻转)。
  • out.write() 函数接收一张图片并把它写到指定的位置,这里指定的位置就是我们创建 VideoWriter 对象时传进去的位置。

如果读者对此函数仍存疑惑推荐此链接希望能为大家解惑OpenCV 用 VideoWriter 创建视频(Python 版本)


  1. FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。视频播放软件通过查询 FourCC 代码并且寻找与 FourCC 代码相关联的视频解码器来播放特定的视频流。比如: DIV3 = DivX Low-Motion, DIV4 = DivX Fast-Motion, DIVX = DivX4, FFDS = FFDShow 等。比如wav、avi等RIFF文件的标签头标示,Quake 3的模型文件.md3中也大量存在等于“IDP3”的FOURCC。【可用的代码列表可以在fourcc.org中找到】
    在Fedora:DIVX,XVID,MJPG,X264,WMV1,WMV2。 (XVID是更优选的,MJPG导致高尺寸视频,X264提供非常小的视频)
    在Windows中:DIVX(更多待测试和添加)
    FourCC代码作为MvPV传递为cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’)或cv2.VideoWriter_fourcc(*'MJPG) ↩︎

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值