树莓派3B+ 安装Opencv-3.4.14

搞了1个多星期,终于装上了,坑太多了,现在做做记录方便日后查阅。树莓派的系统也是上个星期安装的,系统安装好第一件事就是更改软件源:可以参考 树莓派入门笔记(八)更新树莓派软件源

安装前准备


在树莓派上扩展文件系统,以包括TF卡上的所有空间:

#输入一下命令,打开配置菜单
sudo raspi-config


#在配置菜单中选择: Advanced Options -高级选项
#然后选择:A1 Expand Filesystem .... - 扩展文件系统
#按回车,最后用tab键切换至<back> <finish>退出。
#直接用reboot重启树莓派,让更改生效。
sudo reboot

#重启后,危机系统以及扩展为包括TF卡上的所有空间了,用df -h 检查输出来验证磁盘是否已扩展

df -h

开始安装

1、更新系统

sudo apt-get update && sudo apt-get upgrade

2、在树莓派上安装OpenCV所需要依赖的工具和一些图像视频库

#安装build-essential、cmake、git和pkg-config

sudo apt-get install build-essential cmake git pkg-config 

#安装jpeg格式图像工具包

sudo apt-get install libjpeg8-dev 

#安装tif格式图像工具包

sudo apt-get install libtiff5-dev 

#安装JPEG-2000图像工具包

sudo apt-get install libjasper-dev 

#安装png图像工具包

sudo apt-get install libpng12-dev 

#安装常用的视频库

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

#安装GTK2.0

sudo apt-get install libgtk2.0-dev

#安装OpenCV数值优化函数包

sudo apt-get install libatlas-base-dev gfortran

3、下载并编译OpenCV源码

建议用wget工具下载,免得编译时出现各种问题的错误,试过了,这是坑点之一。下载目录我直接放到pi的用户目录(/home/pi)

1、下载OpenCV

wget -O opencv-3.4.14.zip https://github.com/Itseez/opencv/archive/3.4.14.zip

2、下载下载OpenCV_contrib库

wget -O opencv_contrib-3.4.14.zip https://github.com/Itseez/opencv_contrib/archive/3.4.14.zip

3、解压OpenCV和OpenCV_contrib库:

unzip opencv-3.4.14.zip
unzip opencv_contrib-3.4.14.zip

4、配置CMake编译OpenCV 3环境

使用CMake设置编译,然后运行 make 来编译OpenCV。这是整个过程中耗时最长的步骤,大约4个小时。回到OpenCV存储库并创建 build 文件夹,用来存放 CMake 编译时产生的临时文件。

#进入解压出来的opencv-3.4.14目录
cd opencv-3.4.14

#新建build文件夹
mkdir build

#进入build文件夹
cd build

设置CMake编译参数,安装目录默认为/usr/local
注意参数名、等号和参数值之间不能有空格,每行末尾“\”之前有空格,这里使用换行符“\”是为了看起来工整,参数值最后是两个英文的点,意思是上级

/** CMAKE_BUILD_TYPE是编译方式
* CMAKE_INSTALL_PREFIX是安装目录
* OPENCV_EXTRA_MODULES_PATH是加载额外模块
* INSTALL_PYTHON_EXAMPLES是安装官方python例程
* BUILD_EXAMPLES是编译例程(这两个可以不加,不加编译稍微快一点点,想要C语言的例程的话,在最后一行前加参数INSTALL_C_EXAMPLES=ON,要C++例程的话在最后一行前加参数INSTALL_C_EXAMPLES=ONINSTALL_CXX_EXAMPLES=ON)
**/
 
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.14/modules \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_CXX_EXAMPLES=ON \
    -D BUILD_EXAMPLES=ON ..

等待几分钟,看到出现Configuring done Generating done,那就完成了!!

5、为树莓派增加SWAP

在开始编译之前,建议你增加交换空间。这将使你使用树莓派的所有四个内核来编译OpenCV,而不会由于内存耗尽导致编译挂起,编译后再改回来就行了。

#打开 /etc/dphys-swapfile文件
sudo nano /etc/dphys-swapfile

#然后编辑CONF_SWAPSIZE变量,改为2048
修改完后保存退出,ctrl-o   回车   ctrl-x

#重新启动交换服务
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

6、开始编译OpenCV

/**
* 以管理员身份,否则容易出错
* make命令参数-j4指允许make使用最多4个线程进行编译,这样编译速度会更快
* 可以根据自己机器的情况进行更改
* 使用tee命令可以将编译过程中终端显示的信息保存到make.log文件中,便于查看,这样即使VNC断线,终端的* 信息太多看不到,也可以通过make.log文件查看编译过程。
**/

sudo make -j4 2>&1 | tee make.log

此过程在4小时左右,做好心理准备,电源。。。散热。。。都处理好吧!!
如果看到进度编译到100%,那么说明编译安装成功。

7、安装OpenCV

#安装
sudo make install

#更新动态链接库
sudo ldconfig

最后注意: 不要忘记回到 /etc/dphys-swapfile 文件:
1.将 CONF_SWAPSIZE 重置为 100MB
2.重新启动交换服务

其他配置

设置库的路径,相当于windows下的环境变量,便于使用OpenCV库,也可以不进行设置,使用的时候说明路径也可。例如在编译时说明使用库的路径是 -L/usr/local/lib

1、配置opencv.conf

打开opencv.conf配置文件,在末端加入如下内容:

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

在末端添加如下内容
注意:?表示一个空格,可能原因是有的语言要求最后有一个空格才可以编译通过。

 /usr/local/lib
 ?

加载一下

sudo ldconfig

2、打开 bash.bashrc 配置文件

打开bash.bashrc配置文件

sudo gedit /etc/bash.bashrc

在最后添加如下内容

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

重启一次你的派

sudo reboot

检测OpenCV使用是否正常

1、图像生成测试

打开Thonny Pythone IDE,把下面代码复制进去运行

import cv2
import numpy as np
cv2.namedWindow("gray")
img = np.zeros((512,512),np.uint8)#生成一张空的灰度图像
cv2.line(img,(0,0),(511,511),255,5)#绘制一条白色直线
cv2.imshow("gray",img)#显示图像
#循环等待,按q键退出
while True:
    key=cv2.waitKey(1)
    if key==ord("q"):
        break
cv2.destoryWindow("gray")

运行结果:
在这里插入图片描述

2、人脸识别测试

把下面源码保存为test.py:

from picamera.array import PiRGBArray
from picamera import PiCamera
from functools import partial
 
import multiprocessing as mp
import cv2
import os
import time
 
 
### Setup #####################################################################
 
os.putenv( 'SDL_FBDEV', '/dev/fb0' )
 
resX = 320
resY = 240
 
cx = resX / 2
cy = resY / 2
 
os.system( "echo 0=150 > /dev/servoblaster" )
os.system( "echo 1=150 > /dev/servoblaster" )
 
xdeg = 150
ydeg = 150
 
 
# Setup the camera
camera = PiCamera()
camera.resolution = ( resX, resY )
camera.framerate = 60
 
# Use this as our output
rawCapture = PiRGBArray( camera, size=( resX, resY ) )
 
# The face cascade file to be used
face_cascade = cv2.CascadeClassifier('/home/pi/opencv-3.4.14/data/lbpcascades/lbpcascade_frontalface.xml')
 
t_start = time.time()
fps = 0
 
 
### Helper Functions ##########################################################
 
def get_faces( img ):
 
    gray = cv2.cvtColor( img, cv2.COLOR_BGR2GRAY )
    faces = face_cascade.detectMultiScale( gray )
 
    return faces, img
 
def draw_frame( img, faces ):
 
    global xdeg
    global ydeg
    global fps
    global time_t
 
    # Draw a rectangle around every face
    for ( x, y, w, h ) in faces:
 
        cv2.rectangle( img, ( x, y ),( x + w, y + h ), ( 200, 255, 0 ), 2 )
        cv2.putText(img, "Face No." + str( len( faces ) ), ( x, y ), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ( 0, 0, 255 ), 2 )
 
        tx = x + w/2
        ty = y + h/2
 
        if   ( cx - tx > 15 and xdeg <= 190 ):
            xdeg += 1
            os.system( "echo 0=" + str( xdeg ) + " > /dev/servoblaster" )
        elif ( cx - tx < -15 and xdeg >= 110 ):
            xdeg -= 1
            os.system( "echo 0=" + str( xdeg ) + " > /dev/servoblaster" )
 
        if   ( cy - ty > 15 and ydeg >= 110 ):
            ydeg -= 1
            os.system( "echo 1=" + str( ydeg ) + " > /dev/servoblaster" )
        elif ( cy - ty < -15 and ydeg <= 190 ):
            ydeg += 1
            os.system( "echo 1=" + str( ydeg ) + " > /dev/servoblaster" )
 
    # Calculate and show the FPS
    fps = fps + 1
    sfps = fps / (time.time() - t_start)
    cv2.putText(img, "FPS : " + str( int( sfps ) ), ( 10, 10 ), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ( 0, 0, 255 ), 2 ) 
 
    cv2.imshow( "Frame", img )
    cv2.waitKey( 1 )
 
 
### Main ######################################################################
 
if __name__ == '__main__':
 
    pool = mp.Pool( processes=4 )
    fcount = 0
 
    camera.capture( rawCapture, format="bgr" )  
 
    r1 = pool.apply_async( get_faces, [ rawCapture.array ] )    
    r2 = pool.apply_async( get_faces, [ rawCapture.array ] )    
    r3 = pool.apply_async( get_faces, [ rawCapture.array ] )    
    r4 = pool.apply_async( get_faces, [ rawCapture.array ] )    
 
    f1, i1 = r1.get()
    f2, i2 = r2.get()
    f3, i3 = r3.get()
    f4, i4 = r4.get()
 
    rawCapture.truncate( 0 )    
 
    for frame in camera.capture_continuous( rawCapture, format="bgr", use_video_port=True ):
        image = frame.array
 
        if   fcount == 1:
            r1 = pool.apply_async( get_faces, [ image ] )
            f2, i2 = r2.get()
            draw_frame( i2, f2 )
 
        elif fcount == 2:
            r2 = pool.apply_async( get_faces, [ image ] )
            f3, i3 = r3.get()
            draw_frame( i3, f3 )
 
        elif fcount == 3:
            r3 = pool.apply_async( get_faces, [ image ] )
            f4, i4 = r4.get()
            draw_frame( i4, f4 )
 
        elif fcount == 4:
            r4 = pool.apply_async( get_faces, [ image ] )
            f1, i1 = r1.get()
            draw_frame( i1, f1 )
 
            fcount = 0
 
        fcount += 1
 
        rawCapture.truncate( 0 )

直接在终端运行:

sudo python3 test.py

在这里插入图片描述

参考的帖子有:
https://www.cnblogs.com/gghy/p/11916830.html
https://blog.csdn.net/cumt240/article/details/80230192
https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

୧⍢⃝୨ LonelyCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值