1. 程式人生 > >樹莓派 python3 安裝 opencv 最容易的方法(非編譯方式)

樹莓派 python3 安裝 opencv 最容易的方法(非編譯方式)

所需環境

通過pip3安裝的。
sudo pip3 install opencv-python imutils numpy scipy pillow
通過系統自帶環境apt-get安裝的。
sudo apt-get install libatlas-base-dev  libjasper-dev
sudo apt-get install libgstreamer1.0-0
sudo apt-get install libgstreamer-plugins-base1.0-0
sudo apt-get install libqtgui4  libqt4-test
## sudo apt-get install python3-pyqt5  #最後這個可以不安裝的,因為檔案比較大。根據實際情況安裝

警告:

如果你沒有對韌體進行更新,很有可能opencv執行的時候還會缺少亂七八糟的庫。

這種情況下的解決辦法就必須更新韌體(上述部分在zero上測試通過,在3b上發現有問題。如果上述操作依然沒有解決你的問題,請執行下面的命令)

// 軟體源更新
sudo apt-get update 
// 升級本地所有安裝包,最新系統可以不升級,版本過高反而需要降級才能安裝
sudo apt-get upgrade
// 升級樹莓派韌體,韌體比較新或者是Ubuntu則不用執行
sudo rpi-update

如果還缺少.so檔案。 執行下面指令,通過安裝opencv2來把系統裡面缺少的檔案進行補充。

sudo apt install python-opencv
如果還有問題,可以留言提問。

下面是安裝之後包的路徑位置和安裝過程中遇到bug的解決過程。

>>> import scipy
>>> scipy
<module 'scipy' from '/usr/local/lib/python3.5/dist-packages/scipy/__init__.py'>
>>> import imutils
>>> imutils
<module 'imutils' from '/usr/local/lib/python3.5/dist-packages/imutils/__init__.py'>
>>> import cv2
>>> cv2
<module 'cv2.cv2' from '/usr/local/lib/python3.5/dist-packages/cv2/cv2.cpython-35m-arm-linux-gnueabihf.so'>
>>> import numpy
>>> numpy
<module 'numpy' from '/usr/local/lib/python3.5/dist-packages/numpy/__init__.py'>
>>> import skimage.filters
>>> import PIL
>>> PIL
<module 'PIL' from '/usr/local/lib/python3.5/dist-packages/PIL/__init__.py'>

在樹莓派上使用sudo apt install python3-pip安裝pip的時候,出現cannot import name 'main’報錯,這個時候通過修改/usr/bin/pip3來解決。

from pip import __main__

if __name__ == '__main__':
    sys.exit(__main__._main())

安裝python opencv包的時候,sudo apt install python-opencv會安裝到python2裡面,python3安裝opencv的方式較複雜,需要安裝的包見
上面通過系統自帶環境apt-get安裝。

python imutils 這個包,在resize操作的時候,會觸發Illegal instruction
這裡是這個包的問題,詳情見參考1.解決辦法自己重寫imutils.resize方法。

def resize(image, width=None, height=None):
    dim = None
    (h, w) = image.shape[:2]
    if width is None and height is None:
        return image
    if width is None:
        r = height / float(h)
        dim = (int(w * r), height)
    else:
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, cv2.INTER_AREA)
    return resized

參考:

https://github.com/jrosebr1/imutils/issues/76
https://blog.csdn.net/qq_30163461/article/details/80396258
https://stackoverflow.com/questions/20518632/importerror-numpy-core-multiarray-failed-to-import
https://blog.csdn.net/T_infinity/article/details/79885302
https://blog.csdn.net/leaves_joe/article/details/67656340