写在前面
移植opencv到arm开发板上,开发板使用buildroot搭建rootfs。手动移植opencv,不使用buildroot自动安装。
编译opencv的交叉编译链需要与buildroot相同。
本开发板是泰山派,rk3566,编译平台:ubuntu18.04
buildroot的交叉编译链在buildroot根目录下的/output/rockchip_rk3566/host/bin
中,其中包含c编译器:aarch64-buildroot-linux-gnu-gcc
和c++编译器:aarch64-buildroot-linux-gnu-g++
下载opencv源码
opencv网站下载源码OpenCV,这里选择sources 3.4.1。
下载得到opencv-3.4.1.zip,将该压缩包发送到ubuntu任意文件夹中。
编译opencv
解压压缩包
在压缩包所在目录,打开终端,将压缩包解压到指定目录,这里解压到/home/lxy/tspi/中
unzip opencv-3.4.1.zip -d /home/lxy/tspi/
进入opencv源码目录
cd /home/lxy/tspi/opencv-3.4.1/
修改源码
首先在源码目录3rdparty/protobuf/src/google/protobuf/stubs/common.cc 这个文件下第 33 行添加#define HAVE_PTHREAD 宏定义才可以编译的过。具体原因是 HAVE_PTHREAD 宏定义了pthread 库。在如下位置添加即可。(正点原子这样教的)
vi 3rdparty/protobuf/src/google/protobuf/stubs/common.cc
创建build文件夹、install文件夹
mkdir build install
使用cmake-gui构建编译cmake
cd build
cmake-gui
选择源码目录和刚刚创建的build目录,点configure
按下图选,选择自定义交叉编译链,next
名字名为 Linux (要严格是Linux)
c编译器选择/home/lxy/tspi/tspi_SDK/buildroot/output/rockchip_rk3566/host/bin/aarch64-buildroot-linux-gnu-gcc
c++编译器选择/home/lxy/tspi/tspi_SDK/buildroot/output/rockchip_rk3566/host/bin/aarch64-buildroot-linux-gnu-g++
Target Root目录选择/home/lxy/tspi/tspi_SDK/buildroot/output/rockchip_rk3566/host/aarch64-buildroot-linux-gnu/sysroot
这里的编译器,不同sdk使用的buildroot编译器可能不同,但是都是在buildroot的putput里,找到大概位置,以gcc结尾是c编译器,以g++结尾是c++编译器。
这里的root目录,选择上述路径,而不是正点原子教程里说的编译器所在的文件夹,之前我选择了host/bin,结果一直编译到63%就失败,浪费很多时间。如果编译失败,不是内存不够,就是cmake配置错了,需要删掉build文件夹内的文件,重新配置cmake。
其他按照图上选,finish。
完成后,在CMAKE中CMAKE_EXE_LINKER_FLAGS参数,设置为-lpthread -lrt -ldl
设置CMAKE_INSTALL_PREFIX参数,设置为上述创建的install文件夹
这里可以设置opencv的其他编译项,比如加模块什么的,这里使用默认参数,直接点Configure,然后点Generate。完成即可关闭页面。
编译opencv
在build路径下,直接编译
make -j 16
编译过程中会有很多警告,不用管,如果想探究,可以看这个教程
执行安装
make install
执行完毕会在install文件夹下有安装文件,如下:
lxy@lxy-virtual-machine:~/tspi/opencv-3.4.1/build$ ls ../install/
bin include lib share
将install/lib
文件夹下的文件复制到开发板的/usr/lib
下即可。
可以将这些文件复制到buildroot的output/rockchip_rk3566/target/usr/lib
中,重新编译buildroot后,重新烧录根文件系统。这样,以后更新根文件系统时,不需要重复将这些文件复制了。