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

从相机捕获视频

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

cap = cv2.VideoCapture(0)

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

ret,frame = cap.read()

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

cv2.waitkey()

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

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

release()

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

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

import cv2 as cv

cap = cv.VideoCapture(0)

if not cap.isOpened():

print("Cannot open camera")

exit()

while True:

# Capture frame-by-frame

ret, frame = cap.read()

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

# Our operations on the frame come here

# gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# Display the resulting frame

cv.imshow('frame', gray)

if cv.waitKey(1) == ord('q'):

break

# When everything done, release the capture

cap.release()

cv.destroyAllWindows()

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

import cv2 as cv

cap = cv.VideoCapture(0)

if not cap.isOpened():

print("Cannot open camera")

exit()

while True:

# Capture frame-by-frame

ret, frame = cap.read()

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

# Our operations on the frame come here

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# Display the resulting frame

cv.imshow('frame', gray)

if cv.waitKey(1) == ord('q'):

break

# When everything done, release the capture

cap.release()

cv.destroyAllWindows()

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

cv2.flip ()

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

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

现在我们加入这行代码:import numpy as np

import cv2 as cv

cap = cv.VideoCapture(0)

if not cap.isOpened():

print("Cannot open camera")

exit()

while True:

# Capture frame-by-frame

ret, frame = cap.read()

frame = cv.flip(frame, 1)

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

# Our operations on the frame come here

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# Display the resulting frame

cv.imshow('frame', gray)

if cv.waitKey(1) == ord('q'):

break

# When everything done, release the capture

cap.release()

cv.destroyAllWindows()

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

从文件播放视频

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

给出实例代码:import cv2 as cv

cap = cv.VideoCapture('test.avi')

while cap.isOpened():

ret, frame = cap.read()

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

cv.imshow('frame', frame)

if cv.waitKey(25) == ord('q'):

break

cap.release()

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')or cv.VideoWriter_fourcc(*'MJPG')`传递。

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

import cv2 as cv

cap = cv.VideoCapture(0)

# Define the codec and create VideoWriter object

fourcc = cv.VideoWriter_fourcc(*'XVID')

out = cv.VideoWriter('output.avi', fourcc, 20.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)

# write the flipped frame

out.write(frame)

cv.imshow('frame', frame)

if cv.waitKey(1) == ord('q'):

break

# Release everything if job is finished

cap.release()

out.release()

cv.destroyAllWindows()

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

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

VideoCapture.get()

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

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

python如何处理视频_OpenCV-Python系列之视频处理入门相关推荐

  1. python绘制汉字_OpenCV Python 绘制中文字

    By 凌顺 2019年9月12日 本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 通过使用PLI在图片上添加中文字符. PIL(Pyt ...

  2. python 创建画板_OpenCV +Python 制作画板

    首先声明一下,本例思路不是博主原创,博主在前人的代码上进行了个性化的修改,制作了一个简单的画图工具.下面附上自己的理解,与君共勉. 效果图 画图工具实现 代码 # coding:utf-8 impor ...

  3. python opencv 录制视频_OpenCV Python 录制视频

    学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现了一点故障,那就是获取到的文件总是为0KB.经过一番查找,终于找到了解决办法. 调用摄像头 调用摄像头作为本实验的基础是 ...

  4. python均值滤波_opencv+python实现均值滤波

    本文实例为大家分享了opencv+python实现均值滤波的具体代码,供大家参考,具体内容如下 原理 均值滤波其实就是对目标像素及周边像素取平均值后再填回目标像素来实现滤波目的的方法,当滤波核的大小是 ...

  5. python 超参数_OpenCV python sklearn随机超参数搜索的实现

    """ 房价预测数据集 使用sklearn执行超参数搜索 """ import matplotlib as mpl import matpl ...

  6. python opencv保存图片_OpenCV Python 保存图片

    By 凌顺 2019年9月12日 本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 通过无损和有损的方式进行图片保存. 实现代码 1,加 ...

  7. python opencv 摄像头_opencv python中摄像头参数的设置

    我正在使用Windows7 64位操作系统以及Python3和OpenCV.我的电脑连接到以下型号的两个罗技网络摄像头: 1)罗技高清网络摄像头C615 2) 罗技QuickCam Pro 9000 ...

  8. python制作礼物_opencv+python制作硬核七夕礼物

    点击上方"蓝色小字"关注我呀 明天就是七夕了! 如果有对象,祝早生贵子!没有对象,祝早结连理! (搞笑一下,祝大家幸福美满吧,嘿嘿嘿) 给大家准备了一份已经写好的代码,利用pyth ...

  9. python 椭圆检测_opencv python中的椭圆检测

    我的图片在这里: 我正在寻找更好的解决方案或算法来检测这张照片中的椭圆形部分(盘),并在Opencv中的另一张照片中对其进行遮罩. 你能给我一些建议或解决方案吗? 我的代码是: circles = c ...

  10. python椭圆拟合_opencv python 轮廓特征/凸包/外接矩形/外接圆/拟合矩形/拟合直线/拟合圆...

    Contour Features 1 图像的矩 cv2.moments() 图像的矩可以帮助计算物体的某些特征,如对象的质心,对象的区域等. 代码: import cv2 import numpy a ...

最新文章

  1. linux java jdk_神级程序员教你如何10分钟在Linux上安装java的JDK?
  2. Android夜间模式的几种实现
  3. java excel表格数据导入
  4. okta-spring_通过Okta的单点登录保护Spring Boot Web App的安全
  5. class 和 struct的区别
  6. 【AI算法模型评测】2 如何评价多标签分类模型的好坏?
  7. 教你 Shiro + SpringBoot 整合 JWT
  8. 【理论】【转】Android项目重构之路:架构篇
  9. C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen
  10. ajax实现文件上传6,实现Ajax文件上传功能
  11. 2021年文件复制软件评测:FastCopy、TeraCopy、KillCopy、ExtremeCopy、Supercopier
  12. verilog符号 与或非 异或_与()、非(~)、或(|)、异或(^)
  13. Word 一级标题与二级标题的标号不同一问题
  14. linux 网络编程相关知识
  15. [360] 《如何保持电力接触网与受电弓亲密接触》
  16. 全球回报最好的 40 个 VC 投资案例,我们可以从中学到什么?
  17. Linux从安装到实战+学校Linux+瑞吉外卖Linux项目部署
  18. 文件太大notepad 打不开怎么办
  19. Begin...end
  20. Mybatis的ResultMap结果集映射

热门文章

  1. LeetCode 65. 有效数字(逻辑题,难)
  2. 剑指Offer - 面试题26. 树的子结构(双重递归)
  3. 端口可以随便设置吗_驱动可以随便更新吗?
  4. python开始之路—基础中的基础
  5. one-hot(独热)、bag of word(词袋)、word-Embedding(词嵌入)浅析
  6. 论文浅尝 | 从知识图谱流中学习时序规则
  7. 仅使用numpy从头开始实现神经网络,包括反向传播公式推导过程
  8. transformer xl在文本生成上面的应用
  9. 万字长文:近年来学界、业界视角下的“事理图谱”发展总结与思考
  10. 【LeetCode】3月27日打卡-Day12