【Linux开发】Ubuntu下交叉编译opencv

参考文章:https://blog.csdn.net/qq_30155503/article/details/79983630https://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 <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#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

猜你喜欢

转载自blog.csdn.net/tq384998430/article/details/98874569