树莓派3b+ 编译安装OpenCV4.1.0+opencv_contrib-4.1.0

     买了个树莓派3b+,因为做图像,想在树莓派上安装个OpenCV,现在OpenCV都更新到OpenCV4.1.0了,据说在深度学习方面有了更多的改进,那就安装个最新版本吧。

    关于树莓派烧录系统(2019-04-08-raspbian-stretch),更改源等步骤本文不再赘述。OpenCV4.1.0和opencv_contrib-4.1.0的安装包大家可从GitHub上搜索下载,如果不想搜索,可从我的百度网盘下载(同时网盘内也上传了一些Cmake易下载失败的文件):

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

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

在树莓派编译OpenCV需要很大的内存,SD卡最好至少16个G(我的SD卡位32个G)。由于刚刚使用,树莓派根分区比较小,我们需要扩展空间,可按照如下链接操作:https://www.ncnynl.com/archives/201612/1154.html

我在编译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    /swap    swap    defaults 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  如下图所示:

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

安装依赖包,命令如下:

sudo apt-get installbuild-essential 
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

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

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

sudo apt-get install cmake-gui

安装完毕打开cmake-gui,命令:cmake-gui  。在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)。如下图所示:

选择完毕点击Configure,配置完毕如下图所示

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

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

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

找到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个文件。

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

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

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

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目录下输入命令:

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 

新建文件如下图所示:

我们发现,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

即可看到显示照片。

  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值