OpenCV后续的踩坑实录和解决办法

FunnyWii
FunnyWii
发布于 2023-06-12 / 60 阅读
0
0

OpenCV后续的踩坑实录和解决办法

GLIBCXX3.4.9 not found 解决方案

  1. 我是因为python的opencv的问题,可以尝试安装python版的opencv
pip install opencv-python
  1. 但是如果上面的方法解决不了这个问题,
sudo apt-get install libstdc++6

ARM架构的Jetson设备找不到 ‘v4l2_xxxx’

平台:天准 Jetson AGX Orin

编译时报错:/usr/local/lib/libavcodec.so: undefined reference to `v4l2_open'
根据 Libavcodec.so: undefined reference to `v4l2_open’ - Jetson & Embedded Systems / Jetson AGX Xavier - NVIDIA Developer ForumsJetson TX2 and FFmpeg - Can't initialize nvrm channel - Jetson & Embedded Systems / Jetson TX2 - NVIDIA Developer Forums 提供的办法,似乎是因为 ffmpeg 的安装出现了问题,但是实际上ffmpeg是安装了的。

通过 jtop命令可以看到,当前系统中OpenCV不支持CUDA,因此可以判断,Jetson (大部分厂家出厂的时候,OpenCV都不会给你做CUDA支持,需要自己编译) 自带的OpenCV也可能没有添加ffmpeg的支持,所以我添加对上述库的支持。

Jetson Xavier NX OpenCV 安装 - 知乎 (zhihu.com) 中提到的办法是卸载OpenCV并重装,这个方法没问题,不过没必要这样做。在编译使用OpenCV库的C++代码时,只需要修改 CMakeLists.txt中OpenCV的路径即可。至于对Python的支持,可以后续在conda虚拟环境中单独配置。

于是我直接下载了OpenCV 4.5.4的 source 和 contrib 源码(注意Jetson Orin的CUDA版本为11.x,不支持4.7.0+的OpenCV),并编译,再将 CMakeLists.txt中的 OPENCV_DIR改为源码下 build的路径。

不再报错。

Gstreamer 警告:module avidemux0 reported: Internal data stream error

发生在使用OpenCV读取视频或者相机图像时,症状就是...打不开图像。

是因为OpenCV缺少了Gstreamer相关支持,我认为在build的时候设置 -D WITH_GSTREAMER=ON \ 应该能够解决这个问题。


但是事实证明我是傻逼,添加了GST以后,依旧不能打开图像。所以我认为这是由于OpenCV缺少关于ffmpeg的支持...需要确定ffmpeg是否正确安装。这个可以在OpenCV编译的结果中找到。起初我的OpenCV编译结果是这个样子的:

--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      NO
--       avcodec:                   YES (58.18.100)
--       avformat:                  YES (58.12.100)
--       avutil:                    YES (56.14.100)
--       swscale:                   YES (5.1.100)
--       avresample:                NO
--     v4l/v4l2:                    YES (linux/videodev2.h)

可以看到FFMPEG的选项为NO。导致这个情况的原因比较多,不过归根结底,是你的PKG_CONFIG没能找到FFMPEG。而在terminal中输入 ffmpeg又能正确显示其版本,因此我决定卸载并重新安装FFMPEG。

jocover/jetson-ffmpeg: ffmpeg support on jetson nano (github.com) 仓库中有手动编译ffmpeg的方法。

patch ffmpeg and build 这个步骤中,git apply ffmpeg_nvmpi.patch命令只需运行一次,多次运行会报错,不过没有影响,无视即可。然后,./configure --enable-nvmpi也可能报错 nvmpi not found...,去掉后面的 --enable-nvmpi即可解决。nvmpi使ffmpeg能通过显卡解码视频,不过我们的显卡更多用于推理,所以就先不管他了。

针对在make编译时出现的报错(对不起忘记截图了,像是编译过程中某些静态库出现了问题),在编译FFMPEG的时候,增加 –-disable-static–-enable-shared两个选项,并且注意,在原本Github仓库中的 README.MD指南基础上,编译完FFMPEG后,要加入一步 sudo make install

参考文章

[1] https://askubuntu.com/questions/575505/glibcxx-3-4-20-not-found-how-to-fix-this-error


评论