最近搞人脸部署,其中涉及仿射变换,并且使用cv::estimateRigidTransform函数计算仿射矩阵一直报错 is not member of问题。猜测是否是调用opencv出现的问题。
cmake的时候发现ncnn默认调用的opencv4.2.0,并且是在/usr下面找的,不对啊,我明明是在/usr/local/下面安装的4.0.1。为啥出现这个问题?
了解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下有相关包。
猜测x86_64-linux-gnu.conf里面链接了路径,打开发现/usr/lib/x86_64-linux-gnu被设定在共享链接库中!到这里已经问题处出在哪里了。更多的/etc/ld.so.conf.d/相关作用可查看这里!出现这种问题可能是以往胡乱安装opencv导致的问题,以后安装软件还是需要花一点时间做内存管理,不然往后可能会出现各种问题......
ok,opencv版本的对不上已经找到,但是问题如何解决呢?
查询cv4改为estimateAffine2D用法,遂改后,尝试添加头文件#include
问过好友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
安装完成后,查看当前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。