参考文章:https://blog.csdn.net/qq_30155503/article/details/79983630、https://www.jianshu.com/p/0fcdce428d8f。
一开始编译opencv的时候我使用了交叉编译器4.4.1和4.6.3两个版本,opencv试验了4.1.1、3.4.7两个版本,编译都遇到一堆莫名其妙的问题,有的问题能解决,但是有的没有头绪,例如编译opencv-4.1.1的时候出现问题,好像指的是编译器不支持C++11,但是opencv-4.1.1源码中使用了C++11的特性,低版本的编译器无法编译通过(或者有的版本的编译器默认没有打开C++11的特性,需要主动打开,在编译的时候加上参数“-std=c++11”,未实验)。然后4.6.3版本编译器编译opencv-3.4.7的源码的时候出现问题“c++: internal compiler error: Killed (program cc1plus)”,这个问题后来我实验了创建交换区以增加虚拟内存可以解决,在OrangePi PC上跑Ubuntu 16.04本地编译OpenCV 4.1.1源码通过,关于Linux创建交换区参考文章:https://blog.csdn.net/fenquegong2126/article/details/80988452,这里在OrangePi PC上增加了4G的虚拟内存空间,1G的空间还是不够用,还会再报错,还有一点比较搞笑的是在全速编译的过程中(make -j4),全志H3的发热简直可以煎鸡蛋了,散热处理不好的话可能会导致CPU过热保护。
后面我参考了“参考文章”中的配置,使用交叉编译器版本4.5.1,opencv版本3.2.0,编译通过。
前面的步骤参考:https://blog.csdn.net/tq384998430/article/details/98872637 Ubuntu下opencv的编译安装,接该文章的第3步操作:
4、apt-get install cmake-qt-gui安装图形化配置工具。
5、执行cmake-gui进入图像化配置界面,Where is the source code对应opencv源码的文件夹,Where to build the binaries对应opencv存放编译好的配置文件等信息的文件夹(刚才创建的build文件夹)。
6、点击Configure,弹出编译方式选择对话框,选择“Unix Makefile”以及“Specify options for cross-compiling”,然后点击next,进入配置界面:
Target System中Operating System选择Linux,Processor选择arm。Compiler中C编译器选择交叉编译器arm-none-linux-gnuabi-gcc,C++选择交叉编译器arm-none-linux-gnuabi-g++。Find Program/Library/Include中Target Root选择交叉编译器中的lib目录(也有的文档写的是选择bin目录)。点击Finish。
7、重新进入配置界面:
其中CMAKE_INSTALL_PREFIX选择另一个目录,因为/usr/local下已经安装了一个本机的x86/x64的opencv了,重装到这个目录会覆盖原来的安装,这里我选择/opt/opencv3.2.0,然后点击Configure,完成之后点击Generate生成Makefile文件。
8、make -j4
9、出现错误:
错误显示没有在交叉编译器的lib下找到静态链接库libgtk-x11-2.0.so文件,当然没有了,gtk有不是标准支持的,我们重新进入到第7步,搜索gtk,然后将WITH_GTK项取消勾选,然后重新Configure和Generate并重新编译:
10、编译完成:
进行安装:make install
完成后查看安装目录内容:
这里面就是我们需要的opencv库了。执行opencv_version命令查看opencv版本:
额,错了,这是安装在本地的x86/x64版本的opencv,我们安装的目录位置在:/opt/opencv3.2.0/bin/openv_version:
额,还是运行不了,readelf -h /opt/opencv3.2.0/bin/openv_version发现这是基于ARM的可执行文件,将/opt/opencv3.2.0文件夹全部复制到ARM板,在目标板上运行openv_version:
没有问题,opencv库已经就绪,来个例程测试一下,先设置环境变量:
export LD_LIBRARY_PATH=/opt/opencv3.2.0/lib/:$LD_LIBRARY_PATH #链接库位置
export C_INCLUDE_PATH=/opt/opencv3.2.0/include/:$C_INCLUDE_PATH #C语言的头文件搜索路径的环境变量
export CPLUS_INCLUDE_PATH=/opt/opencv3.2.0/include/:$CPLUS_INCLUDE_PATH #C++的头文件搜索路径的环境变量
新建一个cpp文件:
#include
#include
#include "stdio.h"
using namespace cv;
using namespace std;
int main()
{
int i;
Mat srcImage = imread("lena.jpg");
Mat dst;
cvtColor(srcImage, dst, CV_RGB2GRAY);
imwrite("out.jpg",dst);
return 1;
}
创建一个Makefile文件:
CC = arm-none-linux-gnueabi-g++
#CC = gcc
all:
arm-none-linux-gnueabi-g++ \
-o test test.cpp \
-lopencv_core \
-lopencv_highgui \
-lopencv_imgcodecs \
-lopencv_videoio \
-lopencv_imgproc \
-L/opt/opencv3.2.0/lib/ \
-I/opt/opencv3.2.0/include
c:
rm *.o test
源码的功能就是读取lena.jpg图片,然后将图片转成灰度图像,并保存到out.jpg文件,由于开发板没有gtk界面,只好在Ubuntu的nfs服务器上打开看效果了:
ERROR参考文章:
http://blog.sina.com.cn/s/blog_4c451e0e0102ye9v.html
http://blog.sina.com.cn/s/blog_4c451e0e0102ye9v.html
https://www.veryarm.com/15856.html