视频处理在 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(0)
4. 如果 不是cap.isOpened():
5. 打印(“无法打开相机” )
6. 出口()
7. 而 True:
8. #逐帧捕获
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(0)
4.如果 不是cap.isOpened():
5. 打印(“无法打开相机” )
6. 出口()
7.而 True:
8. #逐帧捕获
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 的参数表:
现在我们加入这行代码:
查看普通副本到剪贴板打印?
1.将numpy导入为np
2.将cv2导入为cv
3.cap = cv.VideoCapture(0)
4.如果 不是cap.isOpened():
5. 打印(“无法打开相机” )
6. 出口()
7.而 True:
8. #逐帧捕获
9. ret,frame = cap.read()
10. 框架= cv.flip(框架,1)
11. # 如果 正确读取帧,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(0)
4.#定义编解码器并创建VideoWriter对象
5.fourcc = cv.VideoWriter_fourcc(* 'XVID' )
6.out = cv.VideoWriter('output.avi' ,fourcc,20.0,( 640,480 ))
7.而 cap.isOpened()
8. ret,frame = cap.read()
9. 如果 不退回:
10. 打印(“无法接收帧(流的末尾?)。正在退出...” )
11. 打破
12. 框架= cv.flip(框架,1)
13. #写翻转的框架
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技术信息可以入群交流~