按照上篇之一的进度,已经编译及安装好了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,内容如下:
为方便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:
为什么会出现这么多警告?我也不知道
三、移植至开发板
将上一篇安装的库移到开发板上去,只需将安装目录的 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见