第一步:我们用树莓派提供的交叉编译工具来编译Opencv源码库
1.继续使用前面博客下载下来的Opencv源码. 这里重新放入到某个路径下
在源码下面新建一个build文件夹,用来存放编译产生的文件。在build文件夹下再新建一个install文件夹,用来存放安装文件(编译出来的include、bin、lib)。
2.如下命令安装带有图像界面的CMake工具
sudo apt-get install git cmake-qt-gui
命令行下输入cmake-gui便可以打开该软件,如下方式先选择好两个路径(结合自己的路径)
然后点击Configure
选择最后一项后,点击Next按钮,下面界面上如下配置
这里交叉编译工具就使用前面博客所下载的交叉编译工具。完毕后选择Finsh按钮,log窗口那边显示Configuring done
在选项中我做了如下更改:
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文件
修改CMakeCache.txt文件,将CMAKE_EXE_LINKER_FLAGS:STRING=修改为
CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -ldl -lrt
保存退出文件。
在CMake GUI上点击File菜单栏里的Reload Cache选项,重新装载配置项,重新点击左下角的Configure按钮和Generate按钮
关闭Cmake图像界面程序。在终端下cd到build目录,输入sudo make -j4
等待编译完毕
结束后再输入sudo make install命令
第二步:编写含有opencv的c++程序,交叉生成可执行文件
1.博主将如上文件夹放到了一个新的位置,并在此目录下新建了一个pkgconfig文件夹
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}
输入命令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
输入完毕后,执行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做测试,博主将其放在了此路径下
修改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便生成了 。
第三步:将交叉编译的含有opencv功能的可执行文件拷贝到树莓派上运行
1.将上面生成的可运行文件拷贝到树莓派上,博主放在此目录下
2.终端cd到此目录下,先后执行如下语句
sudo chmod 755 example_cross1.out
./example_cross1.out
出现如下执行信息
可以看到中间日志有输出,但也跟了一堆报错信息:
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更新,此问题已经解决,见我的博客