分享

在树莓派3搭载Raspbian Jessie系统上编译openCV

 风雪夜归人_95 2017-08-27
      本文主要参考了一个外国人写的博客:http://www./2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/
      其他系统或平台可以根据下面这个地址对号入座:http://www./opencv-tutorials-resources-guides/
      感觉外国人写的东西还是比较清楚的,step by step。这篇文章还把每一步所需要的时间也拿出来了,非常贴心。避免在一些要很长时间的步骤傻等在那的尴尬。本文根据第一个网址在装有Raspbian Jessie 的树莓派3上编译openCV。但是还是遇到了一些问题或者与作者描述不同的现象,现在把它记录下来,针对一些时间超过五分钟的步骤,笔者也把它标记一下。下面的内容已经默认已经有了一个装有Raspbian Jessie的树莓派3,且可以通过SSH或者其他方式可以访问到树莓派。

一 查看树莓派版本
      如果不确定树莓派的系统版本,可以使用    lsb_release -a   命令。
      注意,有的网友说使用    uname -a   命令。但是得到的却不是这里需要的信息。
     
二 扩张文件系统
      使用下面命令打开配置项:  sudo raspi-config

并没有找到原文作者写的“Expand File System”这一项,并且使用  df -h  命令查看了一下可用空间,由于作者用的8GSD卡,笔者用的是16G的,故大胆猜测,跳过这一步,应该不会有太大问题。
      至于原文作者提到为了节省空间,删除wolfram-engine,可以节省600多兆的空间。wolfram-engine用于支持wolfram语言,被捆绑在树莓派的操作系统中。百度了一把wolfram感觉不明觉厉。

三  安装依赖文件
1. 更新数据源      
       sudo apt-get update
       sudo apt-get upgrade 
       这一步实际上才是正式开始的第一步,但是笔者一上来更新数据源就出师不利,第二个命令就出错了,非常影响心情。
       具体的报错 当时忘了记录下来,但反正就是更新数据源失败之类的错误,主要问题还是在树莓派更新景象地址上。树莓派的镜像地址存放在 /etc/apt/sources.list 文件中(里面总共三行内容,后两行被注释掉)。当然换个国内的源应该没有问题,但笔者是按照当时网上的一种做法:将该文件第一、二行注释掉,第三行放出来,如下图:
这个做法是可以解决上面的报错问题的。 笔者后面也搜到了一些源,不过担心安全问题,就没有用。可能是笔者多虑了!  

2. 安装依赖文件
这一步和原文的描述出入最大,很多库文件都安装不了,可能还是和上一步的数据源有关。这里仅仅罗列了需要 sudo apt-get 来安装的库,没有或者报"can't locate module XXX"的库,则直接忽略:  build-essential cmake pkg-config libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev 
libgtk2.0-dev libatlas-base-dev fortran python2.7-dev python3-dev

四  下载openCV源码
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
unzip opencv_contrib.zip
这一步下载了opencv 和 opencv_contrib的源文件。opencv_contrib中存放了一些opencv中不太稳定的内容。但最好保证opencv_contrib和opencv的版本要保持一致。

五 安装python及虚拟环境
在Mac上默认安装了python2.7和python3.6。这里就涉及一个问题:到底是选择python2 还是python3。由于树莓派默认是已经安装了python2.7,当时就想用python2.但是python2 会有一个坑,就是不支持中文编码,而python3已经支持了中文编码,所以这里建议还是安装python3,也可
以都装一遍。但是如果在一台机器上,同时安装了python2 和python3 很容易搞混,所以这里建议使用virtualenv。有点虚拟机的意思,就是提供了一套独立的python环境。比如有两个项目分别要用到不同的环境,而我们可以根据各自项目需求来配置不同环境,不用都全局安装。
1. 安装pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
如果已经安装了就可跳过这一步,笔者这里就直接跳过了。

2.安装virtualenv和virtualenvwrapper
sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip

第二个命令不知道为什么要执行,但笔者并没有找到这个路径,反正也是要删除,略过。

3. 配置virtualenv环境
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
在~/.profile文件的末尾添加上面的内容,此时重新打开终端,就可以执行virtualenv相关的命令。如果想在当前终端中生效,也可以执行 source ~/.profile 命令。

4. 创建virtualenv工作环境
mkvirtualenv cv -p python2
mkvirtualenv ovforp3 -p python3
上面分别创建了使用python2 和 python3 的环境,实际使用时 根据需求选择其中一个命令执
行即可。笔者这里选择了第二条命令执行。
执行完后,如果在前面可以看到类似上图红框中的字段,则证明当前处于创建的virtualenv工作环境中。上面的创建命令只用使用一次,即创建该工作环境时。之后,如果需要重新进入该虚拟
环境,可以使用下面的workon命令:
workon ovforp3
这时就可以得到类似上图的现象。

5. 安装Numpy
pip install numpy
这里没什么可讲,记录一下,之前在python2环境中编译时,这里一直安装失败;换成python3环境后,就没有问题。

六. 编译 安装 OpenCV
1. 配置编译项  
编译前确定当前是处于虚拟工作环境中,然后执行下面的命令:
cd ~/opencv-3.1.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
    -D BUILD_EXAMPLES=ON ..
 
这里首先创建了一个build的目录,进入该目录,并执行后面的cmake命令。这个build不知道有什么用,反正从头到最后 也没看到里面有什么内容。但是如果不在这里执行cmake命令,又会报错。姑且这么干吧! 可以看见Cmake命令后面跟了长串参数。大家可以根据名字猜测用处。其中OPENCV_EXTRA_MODULES_PATH的值可以根据实际的路径进行修改。其他的保持不变。
其次 BUILD_EXAMPLES的值后面 有一个“..”(表示上一级),不要忘了。忘了也会出错。
按照原文多说法,这里会得到类似下面的结果:
 笔者也确实得到了,但其中的Interpreter一栏并没有指向像上图中的虚拟环境中的地址,而是直接指向了本机的实际地址。这种现象,原文的解释是当前的工作环境没有切到对应的虚拟环境中,所以使用workon命令做一下切换就可以了。但笔者试了好几次,仍然不行。这让人很纳闷,只能先忽略这个问题。

2. 执行编译
先退回到opencv源代码的根目录,然后执行 make 命令即可。正如原文作者所说,使用
 make -j4 执行一段时间后 由于争抢内核场景的原因会报错。那么老老实实用make命令吧。
执行这个编译命令非常耗时。笔者编过三次,每次的时间至少都在一个小时以上,所以,大家可以干点其他事,再来看结果。
上面也说了,笔者编了三次,肯定不会没事闲的慌,编三次。说明上面的命令有问题。真是坑呀。编了一个小时多,然后就编不过了。看看出错信息:
stitching_detailed.cpp:(.text+0x188c): undefined reference to `cv::detail::SurfFeaturesFinderGpu::SurfFeaturesFinderGpu(double, int, int, int, int)'
这就让人蒙了,突然来一个找不到函数。搜了好久,发现了一个帖子,很有启发:
https://devtalk./default/topic/766474/opencv4tegra-sourcecode-anyone-/
总结一下,就是这里在编译 example目录时,由于缺少了opencv4tegra类库。两种方法:要么安装缺少的类库,要么在编译选项时不编译这部分内容。 考虑到上面的帖子的描述并不是针对树莓派环境,且这部分内容只是example,不影响openCV核心功能,所以决定使用第二种方法。这里需要退到上一步重新执行cmake命令,修改后的cmake命令如下:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
    -D BUILD_EXAMPLES=OFF ..
再次执行make问题,就不会报错了。

3. 安装
sudo make install
sudo ldconfig

4.验证
在/usr/local/lib/python3.4/site-packages/或者/usr/local/lib/python3.4/dist-packages路径下(二选一)中可以找到cv2.cpython-34m.so文件(在python2中是cv2.so文件)。将它的名字改回cv2.so,并在当前的虚拟工作环境中建立软连接。
sudo mv cv2.cpython-34m.so cv2.so
cd ~/.virtualenvs/cv/lib/python3.4/site-packages/
ln -s /usr/local/lib/python3.4/site-packages/cv2.so cv2.so
此时,在终端输入python,进入python交互式命令行,看能否打印出cv2的版本号,如下图:
大功告成。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多