树莓派4b编译安装OpenCV4和opencv_contrib4

转载 Jun先生  2019-09-29 08:39:17  阅读 1267 次 评论 0 条

由于近期4b的发布,我在树莓派的交流群和网上看到有很多买了4b的小伙伴发现4b编译不了OpenCV,其实不是编译不了,而是我们执行 git clone 克隆OpenCV时克隆了最新的(主/Master)分支版本,主分支版本下可能有些不同于旧版本的编译配置,对于小白来说操作起来还是有些难度的,这里我就分享一下我编译 4.1.0 版本的OpenCV和opencv_contrib 的方法,本文章是参考了CSDN【Jun先生】前辈的教程稍做修改而来,在这里先感谢【Jun先生】前辈的分享。


温馨提醒:由于OpenCv比较大,编译需要的内存空间比较大,建议你使用大一点的内存卡用作树莓派里面,我自己使用的是 64G 的内存卡,实际用不了这么大自己可以选择 32G 左右的。


一,扩展根分区和设置swap交换空间

如果树莓派根分区比较小,我们需要扩展空间,可按照如下链接操作:https://www.ncnynl.com/archives/201612/1154.html


本博主经验分享:我编译OpenCV可能由于4b的性能有所提升,我大概编译了3到4个小时就OK了,不过我的4b是4G内存的,操作妥当一次就编译成功,过程中没有遇到任何错误,但是在编译的过程中由于我没有接显示器到4b直接使用 XRDP 连接到树莓派系统GUI进行操作,编译到一半的时候突然远程不到树莓派GUI了包括SSH连进去也不行,搞的我还以为树莓派死机了,我自己看了一下树莓派上的指示灯都显示正常,幸好我没有立即断电重启树莓派,不然前面的编译功夫就白费了,这种情况下建议你要么就事先插一个显示器来操作树莓派(如果在树莓派启动的时候没有插显示器的话再想中途再插显示器树莓派的HDMI口是没有信号输出的这里要注意),要么就乖乖的等编译完成后会自动恢复就可以远程GUI进行操作了。


Jun先生:我在编译OpenCV时至少花了有7个多小时,最后到99%的时候卡死了,鼠标也不能动,键盘也不动,原因是系统默认设置的swap交换空间不够。所以编译之前最好设置一下swap交换2G空间,一方面加快运算速度,另一方面防止卡死。输入命令如下:

1,命令:
cd /opt
sudo mkdir image
sudo touch swap
sudo dd if=/dev/zero of=/opt/image/swap bs=1024 count=2048000
过一段时间会返回信息,这个过程有点小长,注意不是死机了,耐心等一等。返回的信息大概是:
2048000+0 records in
2048000+0 records out
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 242.095 s, 8.7 MB/s
 
2,再输入命令:
sudo mkswap /opt/image/swap
 
检查现有的交换空间大小,使用命令free:
free -m
 
3,启动新增加的2G的交换空间,使用命令swapon:
sudo swapon /opt/image/swap
 
确认新增加的2G交换空间已经生效,使用命令free
free -m
 
4,修改/etc/fstab文件,使得新加的2G交换空间在系统重新启动后自动生效
sudo vim /etc/fstab
 
在文件最后加入:
/opt/image/swap/swapswapdefaults 0 0

二,拷贝opencv文件和安装依赖包

完成以上工作之后,我们需要把OpenCV4.1.0+opencv_contrib-4.1.0文件解压拷贝到树莓派系统里,我是把树莓派SD卡插到读卡器上,再使用Ubuntu16.04虚拟机挂载SD卡,把提前下载好的OpenCV文件拷贝到rootfs/home/pi/install_bag文件夹里的。大家也可以自己下载。将opencv_contrib-4.1.0文件夹改名为opencv_contrib,并放到opencv-4.1.0文件夹里。在opencv-4.1.0文件夹里建立build文件夹,命令:mkdir build  如下图所示:

树莓派4b编译安装OpenCV4和opencv_contrib4

完成以上拷贝工作之后,拔下读卡器,将SD卡插入树莓派,开机,打开终端。进入build文件夹。


安装依赖包,命令如下:

sudo apt-get install build-essential gedit -y
上面这个指令【Jun先生】前辈少输了一个空格
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev -y
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev -y

如果上面的指令执行时,提示找不到某某软件包,可能是你更改过安装源,建议你切换回树莓派官方的安装源


注意:如果你是在 github 手动下载的OpenCv请下载分支下的 4.1.0 版本的源代码包,如果下载主分支下的源代码,编译配置会略有所不同。

这里【Jun先生】用的是直接下载的OpenCv源代码包的方法,我这里用的是 git 直接克隆下来的具体步骤如下:

安装或更新 git 客户端,这个一般系统内自带有,没有的就执行一下这个指令
sudo apt-get install git -y

切换目录
cd /home

新建 gitData 目录,个人喜好下载到这个文件夹内
sudo mkdir gitData

进入 gitData 目录内
cd gitData

克隆 4.1.0 版本的 OpenCV 源代码
sudo git clone -b 4.1.0 https://github.com/opencv/opencv.git
 
克隆 4.1.0 版本的 opencv_contrib ,这里你可以开多一个命令输入窗口 bash 和上面的可以同步克隆,记得新开的窗口按照上面的操作切换一下目录到 gitData 下不然你就下载到其它目录下了
sudo git clone -b 4.1.0 https://github.com/opencv/opencv_contrib.git

克隆好后复制 opencv_contrib 到 opencv 目录内
sudo cp -r /home/gitData/opencv_contrib /home/gitData/opencv

强迫症复制到 opencv 目录后删除一下 opencv_contrib ,注意下面这句命令不要输错
sudo rm -rf /home/gitData/opencv_contrib

创建编译目录
sudo mkdir /home/gitData/opencv/build

克隆的方式建议你在网络比较好的环境进行,我直接晚上睡觉前执行克隆命令下载代码,早上起来2个都下载好了。

三,安装编译OpenCV4.1.0+opencv_contrib-4.1.0

为了安装方便不容易出错,建议使用cmake-gui安装,安装命令如下:

安装 cmake 和 g++
sudo apt-get install cmake g++ -y

安装 cmake-gui
sudo apt-get install cmake-gui -y

安装完毕打开 cmake-gui 界面
sudo cmake-gui


克隆方式下载的代码选择目录如下:

【Where is the source code】:选择 opencv 目录位置(我的位置为/home/gitData/opencv)

【Where to build the binaries】:选择 build 目录位置(我的位置为/home/gitData/opencv/build)


【Jun先生】前辈下载的解压的代码选择目录如下:

【Where is the source code】:选择 opencv-4.1.0 目录位置(我的位置为/home/pi/install_bag/opencv-4.1.0)

【Where to build the binaries】:选择 build 目录位置(我的位置为/home/pi/install_bag/opencv-4.1.0/build)


如下图所示:

树莓派4b编译安装OpenCV4和opencv_contrib4


选择完毕点击【Configure】按钮配置完毕如下图所示:


树莓派4b编译安装OpenCV4和opencv_contrib4

 

找到BUILD_opencv_world,后面的方框点上勾;

找到在CMAKE_BUILD_TYPE 值处输入RELEASE,其他保持不变;

找到OPENCV_ENABLE_NONFREE,在后面的方框点上勾(有的算法有专利,不点这个不能用,比如sift);


克隆方式下载的代码选择目录如下:

找到OPENCV_EXTRA_MODULES_PATH,选择 opencv_contrib 文件夹中的 modules 文件夹,注意是modules文件夹(我的路径是/home/gitData/opencv/opencv_contrib/modules)


【Jun先生】前辈下载的解压的代码选择目录如下:

找到OPENCV_EXTRA_MODULES_PATH,选择opencv_contrib文件夹中的modules文件夹,注意是modules文件夹(我的路径是/home/pi/install_bag/opencv-4.1.0/opencv_contrib/modules)


完成以上工作再点击【Configure】按钮耐心等一等,如果上面还有红色的再点击【Configure】按钮直到没有红色为止【Configure】完成之后点击【Generate】按钮等一等即可。正常情况下,等Generate完成之后,我们可以直接在build目录下输入命令:make  进行编译工作了。但实际上这样很可能出错,我在编译了5个多小时后报错了,出错的原因一般都是说缺少什么文件,缺少的文件主要是Cmake在配置时由于网络不好没下载下来。我在位于build下的CmakeDownloadLog.txt可以查看到有哪些文件下载失败。经常下载失败的文件我上传到了我的百度云,链接还是上面的百度云链接。建议大家编译之前到build目录下的downloads/xfeatures2d文件夹里查看是否有我如下11个文件。


链接:https://pan.baidu.com/s/1htQdAGW16oS1LEkUmN6Jig 
提取码:miyu


树莓派4b编译安装OpenCV4和opencv_contrib4


如果没有务必拷贝到build目录下的downloads/xfeatures2d文件夹里。我在安装时还有一个文件face_landmark_model.dat没有下载成功,将该文件放到build目录下的/share/opencv4/testdata/cv/face目录下,如果没有目录可自行建立。


检查拷贝完毕,最好再次Configure一下,直到没有上面没有红色为止,然后再点击Generate。如果不放心可以再次检查日志。


最后在build目录下输入命令:

克隆方式 切换到编译目录
cd /home/gitData/opencv/build

【Jun先生】前辈解压的方式编译目录
cd /home/pi/install_bag/opencv-4.1.0/build

执行编译操作
sudo make

编译时间很长,需要耐心等待,我编译时没有swap交换空间,最后编译至少7个小时后到99%的时候卡死,后来关机重启添加交换空间,顺利编译成功不再报错。在99%时,


有Building CXX object modules/python2/CMakeFiles/opencv_python2.dir/_/src2/cv2.cpp.o


和Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/_/src2/cv2.cpp.o两部分编译得有40分钟,一度以为又死机了,实际上不是,耐心等待,树莓派编译特别慢。


编译不出错完成之后,在build目录下输入命令即可安装:

最兴奋的一刻,安装编译好的 opencv
sudo make install

四,配置环境

安装完需要配置环境,树莓派可以使用vim,nano等命令进行编辑,也可以安装gedit进行编辑,本菜鸟能力不强,还是喜欢用gedit,就安装了个gedit。输入命令如下:

sudo gedit /etc/ld.so.conf.d/opencv.conf

打开文件之后是空的,输入以下内容:

/usr/local/lib

保存后退出,再输入命令:

sudo ldconfig

更改环境变量,输入命令:

 sudo gedit /etc/bash.bashrc

打开之后,在文件最后面输入以下内容:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 
export PKG_CONFIG_PATH

保存退出,opencv基本上就安装完成了。


五,python/C++程序测试和编译错误调整

我们分别使用python和C++进行测试,对C++编程,存在编译错误问题,下文再叙。

建立show.py文件,输入以下python测试程序并执行:

import cv2
img=cv2.imread('/home/pi/project_photo/2.jpg')
cv2.imshow('input_image',img)
cv2.waitKey(0)

python版opencv可以正常显示出照片,但是新建以下C++程序(test.cpp),opencv编译存在错误:

#include<opencv2/opencv.hpp>
#include<iostream>
 
using namespace std;
using namespace cv;
 
int main(){
    Mat src=imread("/home/pi/project_photo/2.jpg");
    if(src.empty()){
      cout<<"could not load image..."<<endl;
      return -1;
    }
   imshow("input image",src);
   waitKey(0);
   return 0;
}

提示的错误大概是以下这样的:

Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

错误提示说没有opencv.pc文件,我点开树莓派 /usr/local/lib 目录下确实没有 pkgconfig 文件夹,更没有 opencv.pc 文件。那么我们可以自己新建一个 pkgconfig 文件夹,进入该文件夹 新建一个 opencv.pc 文件。


命令为:

sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc
sudo gedit opencv.pc


新建文件如下图所示:

树莓派4b编译安装OpenCV4和opencv_contrib4

我们发现,opencv4.1.0的头文件位于 /usr/local/include/opencv4/opencv2 目录下,所以我们新建的 opencv.pc 里的编辑内容为:

# Package Information for pkg-config
 
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv4
includedir_new=${prefix}/include
 
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.1.0
Libs: -L${exec_prefix}/lib -lopencv_world
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}

 保存退出后,C++编译不再出错。C++的编译命令为:

g++ test.cpp -o test `pkg-config opencv --libs --cflags opencv`

注意:命令中不是单引号'',而是``。


编译不出错产生可执行文件test,输入命令:

./test

即可看到显示照片。


由于我使用的是 C# 进行编程,所以后面我会再写一篇如何在树莓派上编译 opencvsharp 的教程,这篇文章为之后的 opencvsharp 文章垫下了基础,再次感谢【Jun先生】前辈的分享

打赏
本文地址:https://www.yfyun.xin/index.php/post/33.html
温馨提示:文章内容系作者个人观点,不代表悦妃云对观点赞同或支持。
版权声明:本文为转载文章,来源于 Jun先生 ,版权归原作者所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?