OpenCV c++不加载任何视频在Ubuntu 16.04下的视频捕获
OpenCV C++ does not load ANY video on Ubuntu 16.04 under VideoCapture
我在安装所需的依赖项后安装了OpenCV 2.4.13,我正在用Qt Creator 5.7运行它,以便在c++中编程。在一些教程之后,我设法加载静态图像,处理它们等等。但是当我尝试使用cv:: videoccapture时,例如:
cv::VideoCapture cap;
cap.open("<File location/file name>");
或:
cv::VideoCapture("<File location/file name");
cap.isOpened()
总是返回false。即使我试图忽略这一点,并进一步使用Mat、read、imshow等,程序也会崩溃。我已经尝试了关于加载文件的一切:给出std::string
作为参数,给出*char
,将视频文件放在更容易的位置,在项目目录中,没有任何作用。我尝试了两种不同的。mp4格式,mov格式和cube4格式。在"samples"文件夹中给出的avi文件(来自openCV示例)。所有这些文件都可以在我的VLC中完美地播放。我已经在Qt中尝试了QtWidgets项目和一个plainCpp项目。这行不通。在搜索它之后,我发现这个bug是非常反复出现的,但我刚刚找到了Windows的解决方案,关于在项目中添加.dll文件。但是在Ubuntu上我该怎么做呢,因为Linux不使用dll ?
我想出了解决这个问题的方法,我在这里与遇到类似问题的每个人分享。首先,由于某种未知的原因,我的FFmpeg安装在OpenCV编译中被忽略了。由于FFmpeg需要读写视频,OpenCV无法完成这些工作,并且没有显示任何错误或警告消息。不管怎样,我决定从头再试一遍。请记住:如果您只是重新安装FFmpeg,它不会解决您的问题;之后,你必须做cmake
,再次编译和安装OpenCV。我从存储库下载了最新版本的FFmpeg,编译并重新安装了它。我试图再次编译OpenCV,但在处理带有消息的FFmpeg (Libav) .h文件时,它总是停留在约15%:
<file_name.h> can not be used when making a shared object; recompile with -fPIC
所以我搜索了它,经过一番努力,我发现有必要在执行make
之前用以下配置行编译FFmpeg:
.configure --enable-pic --enable-shared
一些ffmpeg安装教程在"configure"之后包含更多命令。然后我编译并重新安装了FFmpeg,编译并重新安装了OpenCV。在那之后,我能够加载视频(cap.isOpened()
不再是假的),但尽管如此,我得到以下错误的任何视频,他们没有被读取:
Assertion desc failed at libswscale/swscale_internal.h:674
我发现解决这个问题的方法是下载最新的稳定的 FFmpeg版本而不是最新的版本,再次编译它,再次编译OpenCV,然后它成功了!现在我可以加载和编写视频文件(我还没有用多个编解码器测试过)。我想知道为什么他们不推出预先编译的OpenCV版本,这样我们就不需要处理所有这些事情了…
概括一切:
- 下载最新稳定版本的FFmpeg。如果它不起作用,试试旧的。(我使用2.8.6,最后一个稳定的现在)。
- 解压,从ffmpeg文件夹打开终端,编译并安装,输入:
.configure --enable-pic --enable-shared
make
sudo make install
- 下载OpenCV(如果你还没有这样做),按照官方linux安装教程解压并安装:http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html linux安装
我通过安装"opencv3.2.0-dev"代替"opencv3.2.0"来解决这个问题;
- 松弛原子与无同步情况下的记忆连贯性
- 如何在c++中录制具有精确帧时间戳的视频
- vscode下的Arduino代码出现意外编译错误
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 在 C/C++ 中打开驻留在 "/sys/" 下的文件时出错
- 无法安装 R 包 "nloptr"(Ubuntu 16.04 上的 R3.6.2) - C++编译器问题
- 特定情况下的分段错误
- 这是 ubuntu 16.04 中的 gdb 错误吗?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 为什么在 Ubuntu 18.04.1 的 netinet 中没有定义in_addr6?
- 矩阵中主对角线下的最高偶数.超大数字的解决方案?
- Cygwin下的gcc 9.3.0预处理器:cmdline -Dname,但名称似乎未定义
- 如何解决我在 Ubuntu 19.04 下使用 GLFW 时遇到的这个编译问题?
- 在 Ubuntu 16.04 下构建 Android linphone 给出了 CC 和 CXX 的 cmake 路径变
- 未选中C++返回语句.Linux
(UBUNTU 16.04) 下的
- SFML仅列出调试模式下的无效视频模式
- OpenCV c++不加载任何视频在Ubuntu 16.04下的视频捕获
- SDL 1.3:如何在不显示的情况下渲染视频
- 为什么ubuntu 12.04下的OpenMP比串行版本慢