本文仅记录个人在使用树莓派4的opencv时的总结。

0. 主要参考

1. 一些新得

这次安装中一些新想到的,故此补充。

  1. 在执行CMAKE这一步时,取消了一些编译。
cmake -D CMAKE_BUILD_TYPE=RELEASE \
            -D CMAKE_INSTALL_PREFIX=/usr/local \	//system wide installation. 原来:$cwd/installation/OpenCV-"$cvVersion" \
            -D INSTALL_C_EXAMPLES=OFF\	//原来为ON
            -D INSTALL_PYTHON_EXAMPLES=OFF\	//原来为ON
            -D WITH_TBB=ON \
            -D WITH_V4L=ON \
            -D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-$cvVersion-py3/lib/python3.5/site-packages \
        -D WITH_QT=OFF\	//原来为ON
        -D WITH_OPENGL=OFF\	//原来为ON
        -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
        -D BUILD_EXAMPLES=OFF\	//原来为ON

认为这些Build没有用,故取消;

  1. 在执行下一步make -j4之前,需要修改swap空间大小,否则编译到100%时卡死,鼠标都动不了
sudo vim /etc/dphys-swapfile
CONF_SWAPSIZE=100 改成 1024
# 重启交换服务
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
  1. 在执行make install之前,确定pi4没有安装任何opencv的库。此时查找opencv关键字:
sudo find / -iname "*opencv*"

只能在创建的下载路径和build中找到。同时在

/usr/lib/python2.7/
/usr/lib/python3/

下找到有些相关文件,

  1. dmtx库需要用新的环境进行编译,否则可能版本不对,提示:
    libdmtx.a: file not recognized: file format not recognized.
    且编译后的结果存在了
    /usr/local/lib 下
  2. 在make时,出现:
warning: libImath-2_2.so.12, needed by dir/libopencv_highgui.so, not found, (try using -rpath or rpath-link)
warning: libIex-2_2.so.12, needed by dir/libopencv_highgui.so, not found......

等一些列找不到。但查找opencv安装过程,已经装过了相关组件。
通过find寻找,能够在/usr/lib/arm-linux-nnueabihif下找到相关组件,但是版本与warning的不同。可见直接将opencv2的库搬过来是不行的。还是需要使用opencv4对应的依赖链接库。
注:后来发现,在执行cmake xxx时,自动检查了相关依赖项.so的版本,所以采用opencv4的安装依赖时,不可以使用旧的opencv2生成的相应的so进行链接。

2. 关于CMake的进一步理解

写了一个小程序,包含opencv_core库,但代码中并没有引用相关函数,此时可以正常编译,但运行时报错:
cannot open shared object file

原因是并没有找到相应的.so文件,通过ldd xxx可以看出没有link到相应的库。
查询,“You have to distinguish between finding so’s at compile-time and at run-time. ”,在运行时,会按照路径寻找相应的链接库,会优先在LD_LIBRARY_PATH寻找,后再PATH下寻找相应链接库,故将众多.so文件安装目录添加到环境变量中去。
解决方案:(来自网络)--------------

方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是退出当前终端后就失效
方法二: 修改~/.bashrc或 ~/.bash_profile或系统级别的/etc/profile

  1. 在其中添加例如export LD_LIBRARY_PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH
  2. source .bashrc (Source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录)
    方法三:这个没有修改LD_LIBRARY_PATH但是效果是一样的实现动态库的查找,
  3. /etc/ld.so.conf下面加一行/usr/local/mysql/lib
  4. 保存后执行 ldconfig 生效
    (ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.)
    方法三设置稍微麻烦,好处是比较不受用户的限制。
    由于安装路径将众多的.so库安装到了/usr/local/libs,所以加上这个路径,可以成功运行。

同时被坑的很惨的是,拷贝opencvcv2的代码到安装opencv4后,虽然重新修改了动态链接库的路径,成功链接,但未修改头文件,导致头文件与对应的链接库不匹配。所以需要重新将opencv4生成的include文件包含到工程中。