这个移植真的给我整冷了,想到以后可能整移植QT还要再次经历这个移植过程,我决定写下我的第一个博客,方便大家学习参考,也方便我以后查阅
这篇内容主要针对如何将x86和arm版本的opencv共同植入ubuntu中,由于作者也处于linux学习阶段,如有疏忽或更好方法,欢迎讨论~
目的:在ubuntu上编写opencv代码,可以g++编译直接在ubuntu上面测试,也可以arm交叉编译写到开发板上运行。
废话少说直接开始
首先要知道x86的opencv4库和arm的opencv4库并不完全一样,所以最好准备两个文件夹存放代码
可以看到我有两个文件夹分别存放arm版和x86版的opencv。
我这里用的是opencv4.4.0,最开始移植我用的4.5.5 arm版会有问题谨慎使用。
安装ubuntu依赖项
跑通ubuntu下opencv代码的同学跳过这步
这些都是Ubuntu的opencv4依赖项,
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv41-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran libgtk2.0-dev libjpeg-dev libpng-dev
若用Python则还需要安装
sudo apt-get install python2.7-dev python3.5-dev
编译x86下的opencv4
首先解压下载下来的安装包然后进入
新建build的文件夹然后进入,并输入
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local..
这里安装目录就选用/usr/local的默认目录就行了
然后开始安装
sudo make -j8 sudo make install
到这步没出现问题的话,那么开始代码测试
随便找个地方新建工程目录,再新建CMakeLists.txt(需要安装有cmake)、main.cpp
#CMakeLists.txt内容
cmake_minimum_required(VERSION 3.5)
#创建工程
project(OpencvTest)
#找自己版本的opencv
find_package(OpenCV 4.4.0 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(OpencvTest main.cpp)
target_link_libraries(OpencvTest ${OpenCV_LIBS})
#include#include using namespace cv; using namespace std; int main(int argc, const char** argv) { Mat img =Mat::zeros(1000,1000,CV_8UC1); imwrite("./test.jpg",img); return 0; }
将两个文件写好后
OpenCV_DIR=/usr/local cmake . make
OpenCV_DIR=/usr/local为什么要用这句等下说明
如果测试成功会在当前文件夹下生成一个纯黑色test.jpg的图片
x86的opencv库就结束啦,以后写代码参考这个流程就可以了
编译arm板的opencv4
先解压opencv4压缩包然后进入,新建build文件夹,进入build文件夹
这次解压的opencv4要和之前x86的是同一个压缩包!!
这样可以保证arm板和电脑的开发环境相同,避免因为版本不同造成的错误
arm板上要配置的cmake有点多,所以用cmake-gui来配置
cmake-gui ..
和x86一样安装表示顺序进行配置
1处选择解压的opencv4路径,2处选择刚新创建的build文件夹
然后下一步选择自己的交叉编译器,平时在arm板用什么编译器就选择什么的
选择对应build下的install文件夹(现在应该是不存在的,编译完自动生成)
勾选编译JPEG和PNG
选择Release
这里添加
-pthread -ldl -lrt
勾选PKGCONFIG,这个很有用
然后
就完成配置了,点右上角叉叉就行了
先不要急着输入 make。首先在源码3rdparty/protobuf/src/google/protobuf/stubs/common.
cc 这个文件下第 33 行添加#define HAVE_PTHREAD 宏定义才可以编译的过。具体原因是 HAVE_PTHREAD 宏定义了 pthread 库。在如下位置添加即可。
cd build/ make -j8 make install
完成编译
测试:
测试文档和上面x86的一样,在一个测试文件夹中添加CMakeLists.txt(需要安装有cmake)、main.cpp,内容和上述一样。
再添加文件arm_linux_setup.cmake
内容如下
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)
根据自己交叉编译器的位置和名称进行替换
现在大致是这个样子的
进行编译
export OpenCV_DIR=/home/book/tools/arm_opencv/opencv-4.4.0/build/install cmake -DCMAKE_TOOLCHAIN_FILE=./arm_linux_setup.cmake . make
有人可能会问为什么要设置export OpenCV_DIR,因为系统共存两个版本的opencv4.4.0,编译器并不知道你要用哪一套,如果用arm板的opencv库肯定无法在ubuntu上运行,反之也是,所以要告诉编译器你要用的库在哪里
这也是困扰我很久的问题,导致我反反复复尝试了许久,如果嫌麻烦可以写个shell脚本一套操作
运行成功
终于写完啦~ 好饿,第一次写博客,有不足的或者错误的地方欢迎指正,欢迎大家讨论留言~~,喜欢这篇文章的话点个再走吧



