解决C++ openCV无法读取视频但是可以读取图像的问题记录

 更新时间:2024年09月10日 11:18:11   作者:路人甲ing..  
在使用OpenCV的cv::VideoCapture读取视频文件时,可能会遇到无法读取特定格式,如MP4的视频文件的问题,本文介绍解决C++ openCV无法读取视频但是可以读取图像的问题记录,感兴趣的朋友跟随小编一起看看吧

C++代码中使用 cv::VideoCapture 读取视频文件时,视频文件路径正确,依然无法读取视频。
我的发现并解决过程(简易版):

1. 确保图片可以正常读取

路径正确!
有读取权限!
读取图像可以成功!

2. 检查 OpenCV 编译配置

确保 OpenCV 支持 MP4 格式的视频解码。你可以检查 OpenCV 编译时是否启用了 FFmpeg:
bash cv::getBuildInformation()
查看是否包含 FFmpeg,如果没有,你可能需要重新编译 OpenCV 支持 FFmpeg。

果然把上面的结果打印出来没看到的FFmpeg相关的内容,大概锁定原因。可能是无法读取 MP4 文件的关键原因。在 OpenCV 中,MP4 文件的读取通常依赖 FFmpeg 库来进行解码。

3. 解决方法1:重新编译 OpenCV,启用 FFmpeg

需要重新编译 OpenCV,并确保包含 FFmpeg 支持。编译步骤大致如下:

  • 下载 FFmpeg 源码并进行编译,生成静态或动态库。
  • 重新编译 OpenCV 时,确保启用了 FFmpeg 支持:
cmake -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_TOOLCHAIN_FILE=<your_android_toolchain> \
      -D WITH_FFMPEG=ON \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D BUILD_opencv_videoio=ON \
      -D BUILD_opencv_highgui=ON \
      <other_flags> \
      ..

确保 WITH_FFMPEG=ON,并且 BUILD_opencv_videoio=ON

或在 CMakeLists.txt 中,指定 FFmpeg 的路径:

cmake -DWITH_FFMPEG=ON -DFFMPEG_DIR=/path/to/ffmpeg ..

4. 解决方法2:检查其他视频 I/O 支持(不推荐)

如果不想重新编译 OpenCV,的确有点麻烦。如果在Android平台运行,则可以使用 Android 的原生 API(如 MediaPlayerMediaCodec)来加载视频,并将每一帧转换为 OpenCV 可处理的格式(如 cv::Mat)。

5. 解决方法3:使用图片序列替代视频(不推荐)

如果不需要处理原始视频,可以使用之前提到的图片序列方案,将视频转换为帧图片,再通过 OpenCV 逐帧读取。

6. 解决方法4:使用特定格式的视频文件(推荐!!!)

OpenCV 可以处理不依赖 FFmpeg 的视频格式,例如:

  • MJPEG (Motion JPEG):这是一个简单的编码格式,基本上就是一组 JPEG 图片组成的视频流。(推荐直接用这个,直接可以预览,文件也小,方便迁移)
  • RAW 格式:如果你能将视频转码为 AVI 的 RAW 格式(没有压缩),那么 OpenCV 通常能够直接读取。(这个贼大,好不一定可以直接预览,略不方便)

可以通过系统指令或者python脚本直接进行视频格式的转换,这样你的avi视频就可以直接被opencv读取了而且不依赖FFmpeg。

下面我直接给出了Python转视频格式的例子:

可以借助 ffmpeg-python 库将 MP4 格式的视频转换为 MJPEG 或 RAW AVI 格式。ffmpeg-python 是 FFmpeg 的 Python 封装,提供了简单的接口来调用 FFmpeg。

首先,需要安装 ffmpeg-python 库:

pip install ffmpeg-python

然后,可以使用以下 Python 代码将 MP4 视频转换为 MJPEG 和 RAW AVI 格式:

转换为 MJPEG 格式

import ffmpeg
input_file = '/path/to/input.mp4'
output_file_mjpeg = '/path/to/output_mjpeg.avi'
ffmpeg.input(input_file).output(output_file_mjpeg, vcodec='mjpeg', qscale_v=2).run()

转换为 RAW AVI 格式

import ffmpeg
input_file = '/path/to/input.mp4'
output_file_raw = '/path/to/output_raw.avi'
ffmpeg.input(input_file).output(output_file_raw, vcodec='rawvideo', pix_fmt='yuv420p').run()

到此这篇关于解决C++ openCV无法读取视频但是可以读取图像的文章就介绍到这了,更多相关C++ openCV无法读取视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中字符串常用函数strcat与strcpy的用法介绍

    C语言中字符串常用函数strcat与strcpy的用法介绍

    以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • 详解MFC/C++调用易语言的整数型和文本型与VS2010互动

    详解MFC/C++调用易语言的整数型和文本型与VS2010互动

    在本篇文章里我们给大家分享了MFC/C++调用易语言的整数型和文本型与VS2010互动相关知识点内容,有兴趣的朋友们可以参考下。
    2018-11-11
  • 递归删除二叉树中以x为根的子树

    递归删除二叉树中以x为根的子树

    今天小编就为大家分享一篇关于递归删除二叉树中以x为根的子树,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 用C++实现队列的程序代码

    用C++实现队列的程序代码

    本篇文章是对使用C++实现队列的程序代码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c++ class中成员与分配内存的问题详解

    c++ class中成员与分配内存的问题详解

    很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的,下面这篇文章主要给大家介绍了关于c++ class中成员与分配内存问题的相关资料,需要的朋友可以参考下
    2021-10-10
  • C语言 以数据块的形式读写文件详解及实现代码

    C语言 以数据块的形式读写文件详解及实现代码

    本文主要介绍 C语言 以数据块的形式读写文件,这里对相关知识资料做了整理,并附代码示例,以便大家学习参考,有学习此部分知识的朋友可以参考下
    2016-08-08
  • C/C++中抽象类详解及其作用介绍

    C/C++中抽象类详解及其作用介绍

    这篇文章主要介绍了C/C++中抽象类详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++ 私有析构函数的作用示例详解

    C++ 私有析构函数的作用示例详解

    这篇文章主要介绍了C++ 私有析构函数的作用,私有析构函数不会影响栈上对象的自动析构,它们会在其作用域结束时自动调用析构函数。私有析构函数主要影响的是对堆上对象的显式删除操作,需要的朋友可以参考下
    2023-06-06
  • C++进程共享数据封装成类实例

    C++进程共享数据封装成类实例

    这篇文章主要介绍了C++进程共享数据封装成类的方法,以实例形式讲述了其封装代码与具体用法,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • C++ 11新特性之右值引用使用案例与应用场景

    C++ 11新特性之右值引用使用案例与应用场景

    右值引用和move语义是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一种新的引用类型,下面这篇文章主要给大家介绍了关于C++ 11新特性之右值引用使用案例与应用场景的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论