Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行

第一步:我们用树莓派提供的交叉编译工具来编译Opencv源码库

1.继续使用前面博客下载下来的Opencv源码. 这里重新放入到某个路径下

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第1张图片

 在源码下面新建一个build文件夹,用来存放编译产生的文件。在build文件夹下再新建一个install文件夹,用来存放安装文件(编译出来的include、bin、lib)。

                        Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第2张图片

2.如下命令安装带有图像界面的CMake工具

sudo apt-get install git cmake-qt-gui

命令行下输入cmake-gui便可以打开该软件,如下方式先选择好两个路径(结合自己的路径)

然后点击Configure

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第3张图片

选择最后一项后,点击Next按钮,下面界面上如下配置

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第4张图片

这里交叉编译工具就使用前面博客所下载的交叉编译工具。完毕后选择Finsh按钮,log窗口那边显示Configuring done

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第5张图片

在选项中我做了如下更改:

BUILD_DOCS取消勾选

BUILD_PNG勾选

BUILD_JPEG勾选

BUILD_SHARED_LIBS取消勾选

CMAKE_INSTALL_PREFIX选择前面新建的Install目录

WITH_CUDA取消勾选

WITH_OPENCL取消勾选

WITH_OPENCLAMDBLIAS取消勾选

WITH_OPENCLAMDFFT取消勾选

WITH_OPENCL_SVM取消勾选

完毕后选择再次点击Configure按钮,然后再点击Generate

在build目录下找到CMakeCache.txt文件

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第6张图片

 修改CMakeCache.txt文件,将CMAKE_EXE_LINKER_FLAGS:STRING=修改为

CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -ldl -lrt

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第7张图片

保存退出文件。

在CMake GUI上点击File菜单栏里的Reload Cache选项,重新装载配置项,重新点击左下角的Configure按钮和Generate按钮

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第8张图片

关闭Cmake图像界面程序。在终端下cd到build目录,输入sudo make -j4

等待编译完毕

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第9张图片

结束后再输入sudo make install命令

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第10张图片

 完毕后在install目录下可以看到如下文件Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第11张图片

第二步:编写含有opencv的c++程序,交叉生成可执行文件

1.博主将如上文件夹放到了一个新的位置,并在此目录下新建了一个pkgconfig文件夹

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第12张图片

pkgconfig新建一个叫opencv_ras.pc的文件,里面内容编辑如下:

# Package Information for pkg-config

prefix=/usr/local/raspberry_opencv
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
includedir_old2=${prefix}/include/opencv2

Name: opencv_ras
Description: Open Source Computer Vision Library
Version: 3.4.0
Libs: -L${exec_prefix}/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -L${exec_prefix}/share/OpenCV/3rdparty/lib -lIlmImf -llibjasper -llibjpeg -llibpng -llibprotobuf -l libtiff -llibwebp -lzlib
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new} -I${includedir_old2}

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第13张图片

输入命令sudo gedit ~/.bashrc,打开.bashrc文件,底部输入:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/raspberry_opencv/lib
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/raspberry_opencv/lib

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第14张图片

输入完毕后,执行source ~/.bashrc命令

再执行如下命令

sudo gedit /etc/bash.bashrc

添加如下路径(含有opencv_ras.pc文件的那个文件夹)

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/raspberry_opencv/pkgconfig

完毕后,输入source /etc/bash.bashrc以生效。

此时输入pkg-config opencv_ras --libs

出现如下的信息,表示配置成功,系统可以通过pkg-config找到opencv_ras绑定的lib,include等文件

2.用之前博客中提到的example.cpp做测试,博主将其放在了此路径下

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第15张图片

修改example.cpp中的代码如下:

#include 
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
   Mat img = imread("/usr/108.bmp");
   std::cout << "read ok" << std::endl;
   
   imshow("image", img);
   waitKey(0);

    return 0;
}

终端cd到此目录下,执行如下命令(注意我参数里用的是opencv_ras,不是opencv):

arm-linux-gnueabihf-g++ -v example.cpp -o example_cross1.out $(pkg-config --cflags --libs opencv_ras)  -lpthread -lrt -ldl 

执行成功,在ubuntu下交叉编译得到的含有opencv功能的可执行文件example_cross1.out便生成了 。

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第16张图片

 Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第17张图片

第三步:将交叉编译的含有opencv功能的可执行文件拷贝到树莓派上运行

 1.将上面生成的可运行文件拷贝到树莓派上,博主放在此目录下

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第18张图片

 2.终端cd到此目录下,先后执行如下语句

sudo chmod 755 example_cross1.out
./example_cross1.out

出现如下执行信息

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_第19张图片

可以看到中间日志有输出,但也跟了一堆报错信息:

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 cvShowImage, file /home/icecreamshao/crossbuild/opencv-3.4.0/modules/highgui/src/window.cpp, line 611
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/icecreamshao/crossbuild/opencv-3.4.0/modules/highgui/src/window.cpp:611: 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 cvShowImage

Aborted
 

后续博客会尝试解决此报错。

2022.1.1更新,此问题已经解决,见我的博客


 

你可能感兴趣的:(嵌入式图像处理,树莓派,opencv,ubuntu,交叉编译)