目录
一、我的运行环境
设备 | NVIDIA Jetson Nano |
处理器 | ARMv8 Processor rev 1 (v8l) × 4 |
GPU | NVIDIA Tegra X1 (nvgpu)/integrated |
操作系统 | ubuntu 18.04 LTS |
OpenCV版本 | 4.6.0 |
语言 | C++ |
二、问题描述
之前一直用的OpenCV 3.4.10版本,因为项目改变,版本变为4.6.0。在项目程序运行测试过程中发现,之前正常运行的程序出现崩溃并报错:“段错误 (核心已转储)”
段错误 (核心已转储)
三、问题定位及分析
通过定位,问题出在之前基于OpenCV 3.4.10编译的一个动态库。
进一步定位发现,是因为OpenCV VideoCapture类无法打开指定路径mp4视频文件导致的问题。
于是单独对cv::VideoCapture 进行了测试,发现可以成功打开摄像头并抓取图像帧。但是无法打开mp4视频文件。
推敲原因应该是编译 OpenCV 4.6.0 时没有包含ffmpeg视频解码器或是包含了有问题的ffmpeg库。
于是重新对OpenCV进行编译。
四、解决方案
1. 首先需要安装ffmpeg,有两种方式:
(1)安装ffmpeg方案一:
sudo apt-get update
sudo apt-get install ffmpeg
安装的库路径默认在/usr/lib/aarch64-linux-gnu/(aarch64嵌入式设备的路径,x86_64的路径应该是/usr/lib/x86_64-linux-gnu)
(2)安装ffmpeg方案二:
自编译,默认安装库路径为/usr/local/lib/
2. 编译OpenCV及配置ffmpeg
由于之前项目需要用到ffmpeg视频编解码在Nano上硬件加速功能,需要自己编译ffmpeg。
于是在我系统中存在两个版本的ffmpeg。
在编译OpenCV 4.6.0 cmake-gui界面上进行配置时,我的ffmpeg库默认路径如下
发现两种库都有调用,这或许就是之前编译的OpenCV 4.6.0无法打开视频文件的原因,于是做了以下两种调整。分别进行编译并测试。
方案一:
方案二:
测试结果表明,只有通过方案一编译的OpenCV 才可以成功无警告打开视频文件并抓取帧图像。视频打开模式可以选择cv::CAP_ANY(默认)及cv::CAP_FFMPEG。即:
cv::VideoCapture capture;
capture.open("test.mp4");
或
capture.open("test.mp4", cv::CAP_FFMPEG);
至此问题解决。