Python OpenCV读取显示视频的方法示例

目标

  • 学习读取视频,显示视频和保存视频。
  • 学习从相机捕捉并显示它。
  • 你将学习以下功能:cv.VideoCapture(),cv.VideoWriter()

从相机中读取视频

通常情况下,我们必须用摄像机捕捉实时画面。提供了一个非常简单的界面。让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来。只是一个简单的任务开始。

要捕获视频,你需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(就像我的情况一样)。所以我简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
  print("Cannot open camera")
  exit()
while True:
  # 逐帧捕获
  ret, frame = cap.read()
  # 如果正确读取帧,ret为True
  if not ret:
    print("Can't receive frame (stream end?). Exiting ...")
    break
  # 我们在框架上的操作到这里
  gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
  # 显示结果帧e
  cv.imshow('frame', gray)
  if cv.waitKey(1) == ord('q'):
    break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

cap.read()返回布尔值(True/ False)。如果正确读取了帧,它将为True。因此,你可以通过检查此返回值来检查视频的结尾。

有时,cap可能尚未初始化捕获。在这种情况下,此代码显示错误。你可以通过cap.isOpened()方法检查它是否已初始化。如果是True,那么确定。否则,使用cap.open()打开它。

你还可以使用cap.get(propId)方法访问该视频的某些功能,其中propId是0到18之间的一个数字。每个数字表示视频的属性(如果适用于该视频),并且可以显示完整的详细信息在这里看到:cv::VideoCapture::get()。其中一些值可以使用cap.set(propId,value)进行修改。value是你想要的新值。

例如,我可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)检查框架的宽度和高度。默认情况下,它的分辨率为640x480。但我想将其修改为320x240。只需使用和即可。ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320) and ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240).

注意
如果出现错误,请确保使用任何其他相机应用程序(例如Linux中的Cheese)都可以正常使用相机。

从文件播放视频

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

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():
  ret, frame = cap.read()
  # 如果正确读取帧,ret为True
  if not ret:
    print("Can't receive frame (stream end?). Exiting ...")
    break
  gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
  cv.imshow('frame', gray)
  if cv.waitKey(1) == ord('q'):
    break
cap.release()
cv.destroyAllWindows()

注意
确保安装了正确的 ffmpeg 或 gstreamer 版本。有时,使用视频捕获(Video Capture)是一件令人头疼的事情,主要原因是错误地安装了 ffmpeg / gstreamer。

保存视频

所以我们捕捉一个视频,一帧一帧地处理,我们想要保存这个视频。对于图像,它非常简单,只需使用 cv.imwrite()。这里还需要做一些工作。

这次我们创建一个 VideoWriter 对象。我们应该指定输出文件名(例如: output.avi)。然后我们应该指定 FourCC 代码(详见下一段)。然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作。

FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定视频编解码器的4字节代码。可用代码列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到。它取决于平台。遵循编解码器对我来说效果很好。

在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)
# 定义编解码器并创建VideoWriter对象
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, 0)
  # 写翻转的框架
  out.write(frame)
  cv.imshow('frame', frame)
  if cv.waitKey(1) == ord('q'):
    break
# 完成工作后释放所有内容
cap.release()
out.release()
cv.destroyAllWindows()

到此这篇关于 Python OpenCV读取显示视频的方法示例的文章就介绍到这了,更多相关 Python OpenCV读取显示视频内容请搜素我们以前的文章或下面相关文章,希望大家以后多多支持我们!

(0)

相关推荐

  • 使用python-opencv读取视频,计算视频总帧数及FPS的实现

    如下所示: 1.计算总帧数 import os import cv2 video_cap = cv2.VideoCapture('ffmpeg_test.avi') frame_count = 0 all_frames = [] while(True): ret, frame = video_cap.read() if ret is False: break all_frames.append(frame) frame_count = frame_count + 1 # The value be

  • VS2010+Opencv+MFC读取图像和视频显示在Picture控件

    VS2010+Opencv+MFC读取图像和视频显示在Picture控件,供大家参考,具体内容如下 1.新建MFC对话框应用程序. 其余选项默认,单击完成,创建出对话框应用程序.删掉原来自带的一些控件,添加picture控件和两个按钮. 2.由于以后的代码会用到CvvImage类,而opencv2.3以后就去掉了对它的支持,这里先介绍添加CvvImage支持的方法,直接能用的可以略过这一步. 如下图添加相应的文件: 这里附上两个文件的源码方便使用. #pragma once #ifndef CV

  • python opencv 读取本地视频文件 修改ffmpeg的方法

    Python + opencv 读取视频的三种情况: 情况一:通过摄像头采集视频 情况二:通过本地视频文件获取视频 情况三:通过摄像头录制视频,再读取录制的视频 摄像头采集.本地视频文件的读取.写视频文件,网上都有代码. 我发现情况一和情况三都没有问题,大家注意读取自己通过摄像头录制的视频文件是没有问题的.但读取其他视频都会发现帧率为0(如果你获取视频的帧率并打印出来的话),并且退出读取.这时候读取是不成功的. 进去正题:如何解决读取视频失败的情况.这个问题很普遍,以至在官方教程的程序下面都提示

  • Opencv实现读取摄像头和视频数据

    实际上,按一定速度读取摄像头视频图像后,便可以对图像进行各种处理了. 那么获取主要用到的是VideoCapture类,一个demo如下: //如果有外接摄像头,则ID为0,内置为1,否则用0就可以表示内置摄像头 cv::VideoCapture cap(0); //判断摄像头是否打开 if(!cap.isOpened()) { return -1; } cv::Mat myframe; cv::Mat edges; bool stop = false; while(!stop) { //获取当前

  • opencv实现读取视频保存视频

    不得不说opencv是个强大的东东,以前做一个项目的一个模块时使用到进行图形处理,这次是想将一个视频的播放放慢,以前在网上看到opencv有这个功能,今天就不小心尝试了下,东西不多,主要是做个小记录还有一点要注意的小问题说一下,代码不多,基本上也都是copy的网上的 #include <iostream> #include <assert.h> #include <opencv/cv.h> #include <opencv/highgui.h> #inclu

  • Java使用OpenCV3.2实现视频读取与播放

    Java使用OpenCV3.2实现视频读取与播放,供大家参考,具体内容如下 OpenCV从3.x版本开始其JAVA语言的SDK支持视频文件读写,这样就极大的方便了广大Java语言开发者学习与使用OpenCV,通过摄像头或者视频文件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应用开发任务.可以说OpenCV C++ SDK可以做到绝大多数事情,在OpenCV3.x版本上用Java都可以完成,这样就为很多Java开发者学习OpenCV打开了方便之门. 实现思路 首先用OpenCV相关API读

  • opencv3/C++实现视频读取、视频写入

    视频读取 视频读取,主要利用VideoCapture类下的方法打开视频并获取视频中的帧,具体示例如下: #include<iostream> #include<opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture capture; Mat frame; frame= capture.open("E:/image/a1.avi"); if(!capture.isOpened()) { p

  • Python OpenCV读取显示视频的方法示例

    目标 学习读取视频,显示视频和保存视频. 学习从相机捕捉并显示它. 你将学习以下功能:cv.VideoCapture(),cv.VideoWriter() 从相机中读取视频 通常情况下,我们必须用摄像机捕捉实时画面.提供了一个非常简单的界面.让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来.只是一个简单的任务开始. 要捕获视频,你需要创建一个 VideoCapture 对象.它的参数可以是设备索引或视频文件的名称.设备索引就是指定哪个摄像头的数

  • Opencv python 图片生成视频的方法示例

    本文主要介绍了Opencv图片生成视频,分享给大家,具体如下: 生成视频 import random as rd import cv2 as cv import numpy as np # 保存视频 class RecordMovie(object): def __init__(self, img_width, img_height): self.video_writer = None # 视频对象 self.is_end = False # 结束保存视频 self.img_width = im

  • Python OpenCV读取视频报错的问题解决

    最近由于项目的需要,经常需要使用opencv读视频操作,会经常遇到一个问题,就是视频读完之后会出现报错的情况,虽然不影响代码结果,但是对于吹毛求疵的我实在忍受不了. 会报错的程序: # -*-coding:utf-8-*- """ File Name: read_video.py Program IDE: PyCharm Create File By Author: Hong """ import cv2 def read_video(video

  • python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法

    如下所示: #coding=utf-8 #读取图片 返回图片某像素点的b,g,r值 import cv2 import numpy as np img=cv2.imread('./o.jpg') px=img[10,10] print px blue=img[10,10,0] print blue green=img[10,10,1] print blue red=img[10,10,2] print blue 以上这篇python opencv 读取图片 返回图片某像素点的b,g,r值的实现方

  • python+opencv 读取文件夹下的所有图像并批量保存ROI的方法

    如下所示: import cv2 import os import numpy as np root_path = "I:/Images/2017_08_03/" dir = root_path+"images"+"/" count = 0 for root,dir,files in os.walk(dir): for file in files: srcImg = cv2.imread(root_path+"images"+

  • Python OpenCV读取png图像转成jpg图像存储的方法

    如下所示: import os import cv2 import sys import numpy as np path = "F:\\ImageLib\\VRWorks_360_Video _SDK_1.1\\footage14\\" print(path) for filename in os.listdir(path): if os.path.splitext(filename)[1] == '.png': # print(filename) img = cv2.imread(

  • Python OpenCV读取中文路径图像的方法

    引言 这几天做点小东西,涉及到OpenCV读取中文图像的问题 如果直接读取中文路径的图像,往往返回[] import cv2 cv_im = cv2.imread('老干妈.jpg') 缘起 偶然发现opencv 读取图像,解决imread不能读取中文路径的问题文章,代码简单有效,可以参考下文章底部附录 im = cv2.imdecode(np.fromfile(im_name,dtype=np.uint8),-1) 但是作者代码注释中说该方法读取的图像的通道就会变为RGB,但是我实验仍为BGR

  • python opencv 直方图反向投影的方法

    本文介绍了python opencv 直方图反向投影的方法,分享给大家,具体如下: 目标: 直方图反向投影 原理: 反向投影可以用来做图像分割,寻找感兴趣区间.它会输出与输入图像大小相同的图像,每一个像素值代表了输入图像上对应点属于目标对象的概率,简言之,输出图像中像素值越高的点越可能代表想要查找的目标.直方图投影经常与camshift(追踪算法)算法一起使用. 算法实现的方法,首先要为包含我们感兴趣区域的图像建立直方图(样例要找一片草坪,其他的不要).被查找的对象最好是占据整个图像(图像里全是

  • 解决python opencv无法显示图片的问题

    结合网上解决方法,总结了一下 注意三点: 1.文件名或路径名开头如果会引起转义,则\要替换为\\ 2.文件不能放在桌面,因为读取时按中文路径 3.运行后未响应,原因还没有查明,在下一行 cv.waitKey(0)解决 import cv2 as cv img = cv.imread("D:\\python_file\ae.jpg") cv.imshow("image",img) #cv.waitKey(0) 以上这篇解决python opencv无法显示图片的问题就

随机推荐