前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV 读写视频

OpenCV 读写视频

作者头像
用户6021899
发布2019-08-28 11:37:34
1.9K0
发布2019-08-28 11:37:34
举报

OpenCV读视频前首先需要创建VideoCapture对象:

代码语言:javascript
复制
import cv2
import numpy as np

videoCapture = cv2.VideoCapture("girl.mp4") # 创建VideoCapture对象,用于读取视频

接着获取视频的一些基本信息:

代码语言:javascript
复制
fps = videoCapture.get(cv2.CAP_PROP_FPS)#获取帧率(每秒播放几张图像)
#获取宽高
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fNUMS = videoCapture.get(cv2.CAP_PROP_FRAME_COUNT) #获取帧数

若是写视频(无声音),则需要创建VideoWriter对象:

代码语言:javascript
复制
#创建VideoWriter对象,用于写视频
#videoWriter = cv2.VideoWriter("douyin.avi", cv2.VideoWriter_fourcc('I', '4','2','0'), int(fps), newSize) #此格式文件大
videoWriter = cv2.VideoWriter("douyin.avi", cv2.VideoWriter_fourcc('X', 'V','I','D'), int(fps), newSize)

我们可以自定义视频的显示尺寸:

代码语言:javascript
复制
newSize = (300,650) # 自己设定的缩放后的图像宽高

最后,循环读入每一帧,显示在屏幕上,并写入进新的视频文件:

代码语言:javascript
复制
success, frame = videoCapture.read() # 读取一帧,返回是否成功和该帧图像数组
while success and cv2.waitKey(1) == -1: #如果成功读取,且没按下ESC键
    frame_resized = cv2.resize(frame, newSize) #图像缩放
    mirrorred = frame_resized[:, : :-1,:] # 左右镜像
    cv2.imshow("original", frame_resized)
    cv2.imshow("mirrorred", mirrorred)
    videoWriter.write(mirrorred)#写入一帧
   
    cv2.waitKey(int(1000/int(fps))) #延迟
    success, frame = videoCapture.read()#读取下一帧
    
cv2.waitKey()
cv2.destroyAllWindows()
videoCapture.release()#释放资源

下面是完整的代码,里面额外添加了一些边缘检测,求帧差,镜像,添加文字等功能。(上传的动图像素差是腾讯的锅,压缩得太厉害)

代码语言:javascript
复制
import cv2
import numpy as np
from edge import strokeEdges #自定义的边缘检测函数(之前有介绍)

videoCapture = cv2.VideoCapture("girl.mp4") # 创建VideoCapture对象,用于读取视频
fps = videoCapture.get(cv2.CAP_PROP_FPS)#获取帧率(每秒播放几张图像)
#获取宽高
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fNUMS = videoCapture.get(cv2.CAP_PROP_FRAME_COUNT) #获取帧数
newSize = (300,650) # 自己设定的缩放后的图像宽高
#创建VideoWriter对象,用于写视频
#videoWriter = cv2.VideoWriter("douyin.avi", cv2.VideoWriter_fourcc('I', '4','2','0'), int(fps), newSize) #文件大
videoWriter = cv2.VideoWriter("douyin.avi", cv2.VideoWriter_fourcc('X', 'V','I','D'), int(fps), newSize)
success, frame = videoCapture.read() # 读取一帧,返回是否成功和该帧图像数组
lastFrame = np.zeros((newSize[1], newSize[0], 3)) #
while success and cv2.waitKey(1) == -1:
    frame_resized = cv2.resize(frame, newSize)
    edges = strokeEdges(frame_resized,blurKsize=1, edgeKsize=5) #两个ksize须为奇数
    grayEdges = cv2.cvtColor(edges,cv2.COLOR_BGR2GRAY)#转灰度图
   
    delta =np.abs(frame_resized - lastFrame)
    grayDelta = np.mean(delta, axis =2)#转灰度图的 numpy方法,三通道取均值
    mirrorred = frame_resized[:, : :-1,:] # 左右镜像
    #在图像上添加文字(此方法不能添加中文)
    #putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
    #mirrorred = cv2.putText(mirrorred,"mirrorred", (20,50), font, 1, (0,255,0), 2, 4, False)
    mirrorred = cv2.putText(mirrorred,"mirrorred", (20,50), cv2.FONT_HERSHEY_COMPLEX, 1, (0,255,0), 2, 4, False)
   
    #fliped = frame_resized[ : :-1, :,:]        #上下镜像
    #mirr_fliped = frame_resized[: : -1, : : -1, :] #左右镜像+上下镜像
   
    #同名窗口会“覆盖”掉
    cv2.imshow("original", frame_resized)
    cv2.imshow("mirrorred", mirrorred)
    #cv2.imshow("flipped", fliped)
    #cv2.imshow("mirr_flipped", mirr_fliped)
   
    #cv2.imshow("girlEdge", 255-grayEdges)
    #cv2.imshow("delta", grayDelta)
   
    lastFrame = frame_resized
    videoWriter.write(frame_resized)
   
    cv2.waitKey(int(1000/int(fps))) #延迟
    success, frame = videoCapture.read()
cv2.waitKey()
cv2.destroyAllWindows()
videoCapture.release()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档