ubuntu系统 - python中用cv2.VieoCapture()读取视频失败,咋整?如果用尽方法仍然无法解决,不妨换个别的库吧_videowriter::open返回失败ubuntu-程序员宅基地

技术标签: python  ubuntu  numpy  opencv  

近日在Python环境中用cv2.VideoCapture()读取视频时,cv2.VideoCapture.open()始终返回False。去百度一查,遇到该情况的一大堆。然后查看opencv的官方文档,发现如下内容:

以下内容的出处:https://pypi.python.org/pypi/opencv-python
Q: Why I can’t open video files on GNU/Linux distribution X or on macOS?
A: OpenCV video I/O depends heavily on FFmpeg. Manylinux and macOS OpenCV binaries are not compiled against it. The purpose of these packages is to provide as easy as possible installation experience for OpenCV Python bindings and they should work directly out-of-the-box. Adding FFmpeg as an additional dependency without a “universal” FFmpeg build (e.g. LGPL licensed build like in the Windows wheels) the goal is considerably harder to achieve. This might change in the future.
大致原因是没有编解码器,或者编解码器安装的不正确。那咋解决呢?在stackoverflow有一篇帖子基本上总结的比较全:

// https://stackoverflow.com/questions/31040746/cant-open-video-using-opencv
基本思路就是:

1. git下载ffmpeg源码,编译(具体编译过程帖子里很详细)

2. gitc下载opencv源码,编译(具体编译过程帖子里很详细)。最最最重要的一点,cmake选项一定要加python支持:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_QT=OFF -D WITH_V4L=ON -D CMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic ..
当然其他的选项,看自己情况加,比如opencv的contrib模块等。可以用cmake-gui,能直观的看到那些功能勾上了,那些没勾上。

编译opencv大家都知道,需要半个小时左右,可以去喝杯咖啡再来。

完成后,本帖题目的问题就搞定了。但各种奇怪的事情总会发生,如何还不行,咋整!?

----分割线----

在Python中,可以读视频的库,除了opencv外,还有一个——imageio,这个库的具体介绍见:

https://github.com/imageio/imageio
这个库的核心函数如下:

imread() and imwrite() - for single images
mimread() and mimwrite() - for image series (animations)
volread() and volwrite() - for volumetric image data
get_reader() and get_writer() - for more control (e.g. streaming)
可以看到它就是用来读图像、视频文件、camera等的。

imageio依赖一下环境:

Python 3.x, 2.7 or 2.6
Numpy
Pillow
所有,如果想自己编译源码,要提前安装所依赖的库;如果用pip,就一条命令就够了:

sudo pip install imageio
----分割线----

实际上,很多人都还是习惯用opencv。在Python中,opencv的图像是一个np.array。我们用imageio读取的图像数据要想转换成np.array,还需要一个库,就是skimage:

这个库的官网:

http://www.scikit-image.org/
安装很简单:

sudo pip install scikit-image
----分割线----

好了接下来是一个实例:

import sys
import os
import random
import math
import numpy as np
import linecache
import string
import imageio
import skimage

if __name__ == "__main__":
    print '--STA--'
    strPath = '/home/raintai/local_visual_algorithm/samples/5cc4bc32-64ad-40e4-93e8-b2ab88aa684f.init.mp4'
    if (os.path.exists(strPath) == False):
        print 'file not exist'
    # use imageio to read video file
    curVideo = imageio.get_reader(strPath)
    for i, img in enumerate(curVideo):
        opencvImg = skimage.img_as_ubyte(img, True)
        # 下边就回到熟悉的opencv套路上了
		print opencvImg.shape
    print '--END--'

import sys
import os
import random
import math
import numpy as np
import linecache
import string
import imageio
import skimage
import cv2

if __name__ == "__main__":
    print '--STA--'
    strPath = '/home/raintai/local_visual_algorithm/samples/5cc4bc32-64ad-40e4-93e8-b2ab88aa684f.init.mp4'
    if (os.path.exists(strPath) == False):
        print 'file not exist'
    # use imageio to read video file
    videoReader = imageio.get_reader(strPath)
    FrameNum = videoReader.get_length()
    print 'frame num = ', FrameNum
    for i in range(0, FrameNum):
        img1 = videoReader.get_data(i)
        grayImg = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
        print '%5d'%i, grayImg.shape
    print '--END--'













版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guoyunfei20/article/details/77977482

智能推荐

python二重循环判断回文串_python 递归判断回文串-程序员宅基地

文章浏览阅读247次。def isPlidrom(obj):if 1 == len(obj):return Trueif obj[0] == obj[len(obj)-1]:return isPlidrom()else:return False这里return isPlidrom()里面的参数该怎么写?obj此时应该从开始位置加1,末尾位置减一,如果是c的话 return isplidrom(str+1,len-2)就..._python用循环判断回文字符串

MySql数据库忘记root用户密码的找回_mysql select passwd-程序员宅基地

文章浏览阅读443次。MySQL跳过密码验证并修改密码_mysql select passwd

win11给文件夹添加备注_文件夹备注-程序员宅基地

文章浏览阅读1k次。文件夹很多,单靠名称不方便区分的时候,我们想到是否可以通过给文件夹添加备注或者标题来辨别。如何添加标题的方法还没有找到,本文主要记录如何添加备注!_文件夹备注

阿里云服务器 Ubuntu 18.04 Docker安装配置Nginx、Mysql、PHP、Redis容器服务_ubuntu docker php+nginx 容器搭建-程序员宅基地

文章浏览阅读415次。一、Docker Compose 概述与安装。使用 Docker Compose 可以轻松、高效的管理容器。安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限。参考官方安装地址。#运行以下命令以下载Docker Compose的当前稳定版本:sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -_ubuntu docker php+nginx 容器搭建

历年计算机电路基础期末试题答案,中央广播电视大学2000—2001学年度第二学期期末补考试题及参考答案...-程序员宅基地

文章浏览阅读77次。中央广播电视大学2000—2001学年度第二学期期末补考试题及参考答案试卷代号:3179中央广播电视大学2000—2001学年度第二学期期末补考计算机九九级第四学期计算机电路基础(2)试题2001年9月一、选择题:请将正确答案的题号(每小题二空仅选择一个正确答案)填在横线上(每小题2分,共20分)1.正弦交流电量的三要索有: 、 和初相角。 A 有效值,角频率 B幅值,角频率..._计算机电路基础补考

顺序表基本练习-初始化、插入和输出_第一关:需要编写顺序表的初始化、插入相关操作来完成顺序表的建表操作;编写输出函-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏5次。【问题描述】实现可变长顺序表的建表过程。任务要求:通过顺序表的初始化、插入算法,实现顺序表的建表,并依次输出顺序表元素。_第一关:需要编写顺序表的初始化、插入相关操作来完成顺序表的建表操作;编写输出函

随便推点

ORACLE Active Data Guard 环境下 Standby 的 AWR 创建_oracle19c standby awr-程序员宅基地

文章浏览阅读313次。下面通过实际操作来演示一下在 ORACLE Active Data Guard 环境下,Standby 的 AWR 取得的具体步骤。参照 Doc ID 2469650.1。首先,确认一下主库和备库的状态。■PrimarySQL> select inst_id, open_mode, database_role from gv$database order by 1; INST_ID OPEN_MODE DATABASE_ROLE---------- ------_oracle19c standby awr

Unity批次合并渲染_unity 文本是如何合批渲染的-程序员宅基地

文章浏览阅读1.2k次。Unity批次合并渲染为了减少CPU与GPU交流的成本,减少DrawCall的数量,优化渲染,Unity提供了合并批次进行渲染的方式,其支持动态批次合并、静态批次合并、GPU实例化三种合并批次方式,这些合并批次的方式是通过操作顶点缓冲区对象(VBO)和索引缓冲区对象(EBO)等数据来进行合并处理的。相较于手动合并,unity内置的批处理方法最大的优点是每一个物体仍然支持单独剔除。由于在Unity渲染优化过程中合并批次渲染非常重要,我们今天来探讨一下这三种批次渲染方法的原理与异同关于渲染相关数据结构的_unity 文本是如何合批渲染的

hdoj题库分类_1235 1246 1259 1276 1292找规律-程序员宅基地

文章浏览阅读534次。杭电oj题库分类 分类一: 基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、1056、1058、1061、1070、1076、1089、1090、1091、1092、1093、1094、1095、1096、1097、1098、1106、1108、_1235 1246 1259 1276 1292找规律

AutoIt3常见问题解答-程序员宅基地

文章浏览阅读655次。Q1 如何调试脚本?MsgBox(0,"测试",$var) ConsoleWrite("var=" & $var & @CRLF)Q2 操作CMD相关命令Q2.1 如何运行DOS命令?Run(@ComSpec & ' /c dir>d:\dir.txt',"", @SW_HIDE)#include <Process.au3>..._au3更改显示器分辨率

Java 泛型中的PECS原则-程序员宅基地

文章浏览阅读113次。在泛型编程时,使用部分限定的形参时,<? super T>和<? extends T>的使用场景容易混淆,PECS原则可以帮助我们很好记住它们:生产者(Producer)使用extends,消费者(Consumer)使用super。留下一段代码加深印象(来自JDK 8 Collections.copy()源码)/** * Copies al..._pesc原则csdn

[逆向] x64dbg / od 设置消息断点_x64dbg 怎么下api断点-程序员宅基地

文章浏览阅读2.7k次。背景很多时候在我们不知道目标程序调用了哪些 api 时,需要使用消息断点粗略的定位关键代码位置。比如在游戏里点击一次鼠标,可以根据这个消息向下跟踪点击完鼠标后游戏执行的逻辑。方法一个简单的消息循环是这样的 :while( GetMessage(&msg,NULL,0,0) ) { TranslateMessage(&msg); //将 WM_XXXKEYXXX 消息翻译为 WM_CHAR 消息 DispatchMessage(&_x64dbg 怎么下api断点