Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之二

按照上篇之一的进度,已经编译及安装好了opencv库及opencv_contrib扩展库。

安装好库之后,无非就还有两件事要做:1、配置环境    2、实例编译    3、移植至开发板


一、环境配置

说明:pkg-config是用于编译时指定第三方库的头文件路径及链接库路径的,我们需要借助pkg-config来编译opencv程序。

pkg-config的工作流程:通过XXX.pc文件来找到指定的头文件及库路径的,而XXX.pc文件的路径又需要在环境变量PKG_CONFIG_PATH中指出。

因此,要做两步动作:写XXX.pc文件,设置环境变量

XXX.pc文件的格式:

Name: xxx
Description: xxx
Version: xxx
Cflags:-I/usr/local/include
Libs:-L/usr/local/lib –lxxx –lxxx


1、创建并编辑opencv-arm.pc文件

在/usr/local/arm/opencv-arm目录下创建pkgconfig:

$ mkdir pkgconfig

进行pkgconfig目录下创建并编辑opencv-arm.pc,内容如下:

Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之二_第1张图片

为方便copy:

  1 # Package Information for pkg-config
  2 
  3 prefix=/usr/local/arm/opencv-arm
  4 includedir_old=${prefix}/include/opencv
  5 includedir_new=${prefix}/include
  6 
  7 Name: opencv-arm
  8 Description:  Open Source Computer Vision Library for arm
  9 Version: 3.2.0
 10 Cflags: -I${includedir_old} -I${includedir_new}
 11 Libs: -L${prefix}/lib -lopencv_aruco -lopencv_flann -lopencv_plot -lopencv_tracking -lopencv_bgsegm -lopencv_    fuzzy -lopencv_reg -lopencv_videoio -lopencv_bioinspired -lopencv_highgui -lopencv_rgbd -lopencv_video -lopen    cv_calib3d -lopencv_imgcodecs -lopencv_saliency -lopencv_videostab -lopencv_ccalib -lopencv_imgproc -lopencv_    shape -lopencv_xfeatures2d -lopencv_core -lopencv_line_descriptor -lopencv_stereo -lopencv_ximgproc -lopencv_    datasets -lopencv_ml -lopencv_stitching -lopencv_xobjdetect -lopencv_dnn -lopencv_objdetect -lopencv_structur    ed_light -lopencv_xphoto -lopencv_dpm -lopencv_optflow -lopencv_superres -lopencv_face -lopencv_phase_unwrapp    ing -lopencv_surface_matching -lopencv_features2d -lopencv_photo -lopencv_text

就以上几项

Name: XXX.pc的文件名,如opencv-arm.pc就取opencv-arm

Description:随便填下

Version:opencv的版本号

Cfalgs:指定头文件的路径(-I+opencv头文件路径,如#include "opencv2/core.hpp"这样的,就只需指到opencv2的上一级include)

Libs:指定库路径及列出所有的链接库


2、配置环境变量

跟ubuntu上配置opencv库环境类似,编辑 /etc/bash.bashrc 文件,在最后添加上

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv-arm/pkgconfig


红框为新增,71为ubuntu安装opencv时所加。

注意是pkgconfig目录的路径,即opencv-arm.pc所在的目录

编辑完,保存。

然后,使环境变量生效:

$ source /etc/bash.bashrc


二、实例编译

1、创建并编辑 example.cpp 文件

#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include 

using namespace cv;
using namespace std;


int main()
{
    cout << "Hello OpenCV " << CV_VERSION << endl;

	// 载入图像myImage.JPEG,可换其他格式
	Mat myMat = imread("myImage.JPEG", 1);        
        if(myMat.empty())
        {
            cout << "read mat failed." << endl;
            return -1;
        }
        cout << "read mat success." << endl;

	// 创建一个窗口
	namedWindow("Opencv Image");

	// 显示图像
	imshow("Opencv Image", myMat);

	// 等待按键延时 ms
	waitKey(5000);

    return 0;
}

十分简单的程序,用于显示一张图片。图片格式可换其他,如 *.jpg *.png等,代码中更改对应的文件名即可。


2、交叉编译

输入以入命令:

$ arm-linux-g++ `pkg-config --cflags opencv-arm` `pkg-config --libs opencv-arm` -lpthread -lrt -ldl example.cpp -o example

用 arm-linux-g++编译器,pkg-config指定链接的第三方库,还链接了线程库pthread、rt库、dl库,将example.cpp编译成example目标文件。

结果:

编译通过,生成目标example,但出现了很多warning:

Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之二_第2张图片

为什么会出现这么多警告?我也不知道


三、移植至开发板

将上一篇安装的库移到开发板上去,只需将安装目录的 lib 目录下的库(*.so文件)复制到开发板上的/lib目录。

也把编译出来的可执行文件 example 跟用到的图片 myImage.JPEG 放到开发板某一目录上。


运行:

~ # ./example 
Hello OpenCV 3.2.0
read mat success.
OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /root/library/opencv/opencv-3.2.0/modules/highgui/src/window.cpp, line 565
terminate called after throwing an instance of 'cv::Exception'
  what():  /root/library/opencv/opencv-3.2.0/modules/highgui/src/window.cpp:565: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow

什么东东,竟然跑不下去了。。。。。。

由打印出来的信息猜测,跑到imread()加载完图片就没下文了,应该是显示有问题。其实想想也是的,opencv没关联LCD,怎么调用显示呢。。。


网上查了下,这篇博客讲得很好:https://blog.csdn.net/jd404647184/article/details/45745535

出现这个的原因是因为用户使用了highgui中的功能,比如cvloadiamge之类的。GTK是开源gui,但是开发板应该是很难搭建起这个gui的,arm下qt的gui貌似也很难让opencv依赖,所以还是不要使用highgui的功能,就乖乖进行opencv和qt的转换吧。。。

         这个转换的问题我很感激学长的一席话,我本来为了解决这个问题还想移植GTK上去呢- -,当他一说不要移植GTK的时候我就突然想到以前做过qt和cv的转换,竟然qt能显示那就让qt去显示吧,哎,茅塞顿开。。。”


原来还要往板上移植GTK库。。。。。。

好了,现在没法玩了。。。。。。冇计啦,接受现实

大多数人都不用GTK,而用QT。

那我就去玩QT吧,先去装好QT再回头搞 Opencv + QT

走咯,下篇QT见


你可能感兴趣的:(opencv)