ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)

发现问题

最近搞人脸部署,其中涉及仿射变换,并且使用cv::estimateRigidTransform函数计算仿射矩阵一直报错 is not member of问题。猜测是否是调用opencv出现的问题。

cmake的时候发现ncnn默认调用的opencv4.2.0,并且是在/usr下面找的,不对啊,我明明是在/usr/local/下面安装的4.0.1。为啥出现这个问题?

ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)_第1张图片

ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)_第2张图片

分析问题:

了解linux设置动态库加载方式有以下三种:

1,通过动态库配置文件/etc/ld.so.conf.d进行路径配置。

2,通过在用户环境./bashrc中库加载环境变量LD_LIBRARY_PATH。

3,通过项目中Cmakelist.txt中设定相关库的路径。

其中情况2中的bashrc是经常用到的所以基本不会有问题,情况3中,ncnn是公版发布的更不会出现指定的情况。所以基本就是情况1的原因了。

查找问题:

发现在/etc/ld.so.conf.d里面查到信息如下

深入到/ld.so.conf.d文件夹,发现结构如下

猜测应该是在某一个conf文件里面调用了opencv,执行以下指令查找相关opencv4.2.0动态库位置,果然在x86_64-linux-gnu下有相关包。

ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)_第3张图片

 猜测x86_64-linux-gnu.conf里面链接了路径,打开发现/usr/lib/x86_64-linux-gnu被设定在共享链接库中!到这里已经问题处出在哪里了。更多的/etc/ld.so.conf.d/相关作用可查看这里!出现这种问题可能是以往胡乱安装opencv导致的问题,以后安装软件还是需要花一点时间做内存管理,不然往后可能会出现各种问题......

ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)_第4张图片

 ok,opencv版本的对不上已经找到,但是问题如何解决呢?

解决问题

查询cv4改为estimateAffine2D用法,遂改后,尝试添加头文件#include 依旧这个问题。百思不得其解,后查询opencv源码,发现相关hpp存在,但是还是报错说明动态库calib3d.so估计出现问题,没有这个方法。遂决定重新编译opencv C++版本。

问过好友4.0.0使用起来没有问题,后去github官网下载安装包,并且找到对应安装教程。

 具体思路:独立安装一个版本的opencv,然后仅针对该项目生效,尽量不影响以前的工程。

 把OpenCV: Installation in Linuxhttps://docs.opencv.org/4.0.0/d7/d9f/tutorial_linux_install.html由于官网指令并没有生成pkgconfig下的opencv.pc。参考:linux下编译安装opencv生成opencv.pc_浓茶淡酒的博客-CSDN博客_`opencv.pc、

Ubuntu下多版本OpenCV共存和切换_W_Tortoise的博客-CSDN博客_切换opencv版本

以上两篇都是不错的。 最后安装方式和博客2一样,但是添加了博客1中的pkgconfig选项。

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/home/×××/opencv/opencv-4.0.0/build/installed -D OPENCV_GENERATE_PKGCONFIG=ON ..

由于我们是要多版本并存,所以没有修改ld.so.conf.d,毕竟/usr/lib/x86_64-linux-gnu还有其他共享库,我们可以通过修改bashrc,指定PKG_CONFIG_PATH和LD_LIBRARY_PATH路径来解决。并且在ncnn的cmakelist添加了opencv的指定路径。

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/×××/opencv/opencv-4.0.0/build/installed/lib/pkgconfig
export PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/home/×××/opencv/opencv-4.0.0/build/installed/lib

ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)_第5张图片

 安装完成后,查看当前opencv版本。

pkg-config --modversion opencv

 如果显示不正确的话,可能是以往编译opencv的pkgconfig文件还存在(一般ld.so.conf优先级比bashrc高),直接删除即可。然后系统会重新在bashrc环境中找到最新配置的pkgconfig,注意查看是不是opencv.pc,如果是opencv4.pc的话,可能需要改一下名字为opencv.pc。

ok,最后ncnn在嵌入式环境重新编译,cmake表示opencv版本信息为4.0.0。

ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)_第6张图片

 使用的是单独安装的4.0.0,虽然警告很多,但是不影响使用。编译自己写的model中的仿射变换也没有问题了: ubuntu安装多版本opencv并存(解决ncnn编译出现“*“ is not member of cv)_第7张图片

你可能感兴趣的:(模型部署,ncnn,opencv,深度学习,模型部署)