【转载】OpenCV-Python系列之视频处理入门(六)

视频处理在 OpenCV 中处于极为重要的位置,目标实时跟踪等各种实时图像处理算法都是以视频为基础。

从相机拍摄视频

首先我们来了解一下使用电脑自带的相机来进行捕获视频。通常,我们必须使用摄像机捕获实时流。 OpenCV中提供了一个非常简单的界面来执行此操作。让我们从相机捕获视频(我使用笔记本电脑上的内置网络摄像头),我们需要了解几个函数:

上限= cv2.VideoCapture(0)

VideoCapture()中参数是 0 ,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如 cap = cv2.VideoCapture(“ …/ test.avi”),当然了,如果你分开的有其他的摄像头,那就可以替换其他的参数例如 1 从而调用它。

ret,frame = cap.read()

cap.read()按帧读取视频, ret,frame 是已获胜cap.read()方法的两个返回值。其中 ret 是布尔值,如果读取帧是正确的则返回 True ,如果文件读取到结尾,它的返回值就为假。帧就是每一帧的图像,是个三维矩阵,我们都知道视频是由一帧一帧的图像连续组成的, OpenCV的在对图像处理时就是对每一帧的图像进行快速处理。

cv2.waitkey()

waitKey ()方法本身表示等待键盘输入,参数是 1 ,表示延迟 1ms 切换到下一帧图像,对于视频而言;参数为 0 ,如 cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;参数过大如 cv2.waitKey(1000),会因为延迟过久而卡顿感觉到卡顿。

c得到的是键盘输入的 ASCII 码, esc 键对应的 ASCII 码是 27 ,即当按 esc 键是 if 条件句成立。

释放()

调用 release()释放摄像头,调用 destroyAllWindows()关闭所有图像窗口。

现在我们首先进行代码实验,之后会进行一些说明:

	查看普通副本到剪贴板打印?
 1. 将numpy导入为np   
 2. 将cv2导入为cv   
 3. cap = cv.VideoCapture(04. 如果 不是cap.isOpened():  
 5.     打印(“无法打开相机” )  
 6.     出口()   
 7.True8.     #逐帧捕获  
 9.     ret,frame = cap.read()  
 10.    #  如果 正确读取帧,ret为True  
 11.    如果 不退回:  
 12.        打印(“无法接收帧(流的末尾?)。正在退出...” )  
 13.        打破  
 14.    #我们对框架的操作来到这里  
 15.    #灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)  
 16.    #显示结果帧  
 17.    cv.imshow('frame' ,灰色)  
 18.    如果 cv.waitKey(1== ord'q' ):  
 19.        打破   
 20. #完成所有操作后,释放捕获   
 21. cap.release()   
 22. cv.destroyAllWindows()

在这里插入图片描述

isOpened 可以确定摄像头是否被打开,如果打开则继续,如果打开则继续,如果未成功打开则自动退出。前面的时候我们已经讲过, frame 所指代的,就是摄像头视频的每个帧图像,所以在显示时,我们也是显示每个帧。如果对每个帧图像都进行灰度化处理,那么所显示的视频就是灰度化视频,当然,关于灰度化现在还没有讲到,但是可以先做个小实验,我们来看代码:

	查看普通副本到剪贴板打印?
1.将numpy导入为np  
2.将cv2导入为cv  
3.cap = cv.VideoCapture(04.如果 不是cap.isOpened():  
5.    打印(“无法打开相机” )  
6.    出口()  
7.True8.  #逐帧捕获  
9.  ret,frame = cap.read()  
10. #  如果 正确读取帧,ret为True  
11. 如果 不退回:  
12.     打印(“无法接收帧(流的末尾?)。正在退出...” )  
13.     打破  
14. #我们对框架的操作来到这里  
15. 灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)  
16. #显示结果帧  
17. cv.imshow('frame' ,灰色)  
18. 如果 cv.waitKey(1== ord'q' ):  
19.     打破  
20.#完成所有操作后,释放捕获  
21.cap.release()  
22.cv.destroyAllWindows()  

在这里插入图片描述

大家自己实验,体验一下效果。或许有的人已经发现了,我们的视频跟实际中好像是相反的,属于效果,我们可以取消这种效果,在这里需要介绍一个函数,后面在图像增强部分也会介绍到:

cv2.flip()

函数原型: flip(src,flipCode [,dst])

src 代表输入的图像,我么你来看一下 flipCode 的参数表:

image.png

现在我们加入这行代码:

	查看普通副本到剪贴板打印?
1.将numpy导入为np  
2.将cv2导入为cv  
3.cap = cv.VideoCapture(04.如果 不是cap.isOpened():  
5.  打印(“无法打开相机” )  
6.  出口()  
7.True8.  #逐帧捕获  
9.  ret,frame = cap.read()  
10. 框架= cv.flip(框架,111. #  如果 正确读取帧,ret为True  
12. 如果 不退回:  
13.     打印(“无法接收帧(流的末尾?)。正在退出...” )  
14.     打破  
15. #我们对框架的操作来到这里  
16. 灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)  
17. #显示结果帧  
18. cv.imshow('frame' ,灰色)  
19. 如果 cv.waitKey(1== ord'q' ):  
20.     打破  
21.#完成所有操作后,释放捕获  
22.cap.release()  
23.cv.destroyAllWindows()  

再实验会发现图像已经没有那种有益效果了。

从文件播放视频

从文件播放视频与从摄像机捕获的视频相同,只是将摄像机索引更改为视频文件名。另外,在显示框架时,请使用适当的时间cv.waitKey()。如果太少,则视频将非常快,而如果太高,则视频将变得很慢(嗯,这就是显示延迟的方式)。正常情况下 25 秒钟就可以了。

给出实例代码:

	查看普通副本到剪贴板打印?
1.将cv2导入为cv  
2.cap = cv.VideoCapture('test.avi'3.而 cap.isOpened()  
4.  ret,frame = cap.read()  
5.  #  如果 正确读取帧,ret为True  
6.  如果 不退回:  
7.      打印(“无法接收帧(流的末尾?)。正在退出...” )  
8.      打破  
9.  cv.imshow('frame' ,框架)  
10. 如果 cv.waitKey(25== ord'q' ):  
11.    打破  
12.cap.release()  
13.cv.destroyAllWindows()  

在这里插入图片描述

保存视频

当我们想要保存图像的时候,,这非常简单:只需使用 cv2.imwrite()。而当我们想要保存视频的时候,需要做更多的工作。

这次我们创建一个VideoWriter 对象我们应该指定输出文件名(例如: output.avi )。然后,我们应指定的FourCC 。代码(下一段中的详细信息)然后应传递每秒的帧数( FPS )和帧大小。最后一个是isColor 标志。如果为 True ,则编码器需要彩色框,否则将与灰度框一起使用。

FourCC 是一个 4 字节的代码,用于指定视频编码器以及****。可用代码列表可在fourcc.org 中找到,它称为平台。

在 Fedora的中: DIVX , XVID , MJPG , X264 , WMV1 , WMV2 。(最好使用 XVID 。 MJPG 。可以生成大尺寸的视频 X264 提供非常小的尺寸的视频)

在 Windows 中: DIVX (尚待测试和添加)

在 OSX 中: MJPG ( .mp4 ), DIVX ( .avi ), X264 ( .mkv )。

FourCC 代码作为 MJPG 的 cv.VideoWriter_fourcc ( “ M” , “ J” , “ P” , “ G” )或cv.VideoWriter_fourcc ( *‘MJPG’ ) ` 传递。

以下代码从摄像机捕获,在垂直方向上翻转每一帧,然后保存视频:

	查看普通副本到剪贴板打印?
1.将numpy导入为np  
2.将cv2导入为cv  
3.cap = cv.VideoCapture(04.#定义编解码器并创建VideoWriter对象  
5.fourcc = cv.VideoWriter_fourcc(* 'XVID'6.out = cv.VideoWriter('output.avi' ,fourcc,20.0,( 640480 ))  
7.而 cap.isOpened()  
8.  ret,frame = cap.read()  
9.  如果 不退回:  
10.     打印(“无法接收帧(流的末尾?)。正在退出...” )  
11.     打破  
12. 框架= cv.flip(框架,113. #写翻转的框架  
14. out.write(框架)  
15. cv.imshow('frame' ,框架)  
16. 如果 cv.waitKey(1== ord'q' ):  
17.     打破  
18.#完成工作后释放所有内容  
19.cap.release()  
20.out.release()  
21.cv.destroyAllWindows()  

大家可以自己尝试演示效果。

视频处理的部分基本上就结束了,以上介绍到的将是以后学习中非常重要的基础。而事实上, OpenCV 中对于视频的处理也有更多的操作,现在介绍最后一个函数:

VideoCapture.get()

由于前面我们已经指定 cap = cv.VideoCapture(0),所以调用此函数只需用 cap.get(), get 中将重定向参数,指定参数表:

在这里插入图片描述

共有 18 个参数,而至于相关的代码,请大家自己实验,可以使用 print 函数输出视频的详细信息。

查看文章汇总页https://blog.csdn.net/weixin_44237705/article/details/107864965
更多openvino技术信息可以入群交流~
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44237705/article/details/107933698
今日推荐