OpenCV 读写视频

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

import cv2
import numpy as np

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) #获取帧数

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

#创建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)

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

newSize = (300,650) # 自己设定的缩放后的图像宽高

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

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()#释放资源

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

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()

本文分享自微信公众号 - Python编程 pyqt matplotlib(wsplovePython),作者:wsp

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenCV 直线检测

    OpenCV 中的 HoughLines() 和 HoughLinesP() 函数用来检测直线。它们的差别是第一个函数使用标准的 Hough 变换,第二个函数使...

    用户6021899
  • OpenCV 圆检测

    OpenCV 的 HoughCircles() 函数可以用来在一张单通道图像里检测圆形物体。下面是各参数的介绍:

    用户6021899
  • pyzbar 二维码、条形码识别

    利用python的第三方模块 pyzbar 可以很方便的进行二维码的识别(也能识别条形码,用法别无二致)。

    用户6021899
  • 计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测

    背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算...

    用户1332428
  • opencv: 形态学 转换(图示+源码)

    OpenCV中的形态学转换操作有七种:腐蚀,膨胀,开运算,闭运算,形态学梯度,礼帽,黑帽。

    JNingWei
  • OpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!

    在 OpenCV 中,由于编码的缘故,对于中文的处理并不是很友好,比如中文路径的图片读取和写入以及在图片上绘制中文文字等,这几个问题都是笔者经常遇到的,本文列出...

    机器视觉CV
  • OCR -- seamlessClone泊松融合

    opencv:https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/

    MachineLP
  • 【小技巧】用Python给你的视频添加字幕

    在平常调试代码时,需要对视频添加一些文字说明,下面使用 Python 的 OpenCV 和 PIL 对一个视频进行添加文字。

    机器视觉CV
  • 10x Genomics解读成人视网膜的单细胞转录组图谱

    当你的才华还撑不起你的野心时,请潜下心来,脚踏实地,跟着我们慢慢进步。不知不觉在单细胞转录组领域做知识分析也快两年了,通过文献速递这个栏目很幸运聚集了一些小伙伴...

    生信技能树jimmy
  • 官方背书也不靠谱:特斯拉自动驾驶让撞车率降低40%?算法缺陷

    2016年,特斯拉一位车主发生致命事故,之后,美国国家公路交通安全管理局(NHTSA)对特斯拉自动驾驶仪的安全性进行了研究,研究结果称,特斯拉的自动驾驶系统使撞...

    新智元

扫码关注云+社区

领取腾讯云代金券