Ubuntu 20.04 on raspberry pi 4에 OpenCV를 넣고 파이썬에서 사용

개요


  • Stay Home 주간에 놀기 위해 raspberry pi 4와 High Quality Camera를 포치했는데, 카메라는 휴일 전의 발송 마감에 주문이 늦지 않고, raspberry pi 4만 닿았습니다.
  • 카메라가 오면 반드시 사용하게 될 것이라고 생각하고 OpenCV를 넣어 보았습니다. raspberry pi 4 및 Ubuntu 20.04 및 OpenCV 및 python에서 사용하는 기사를 찾을 수 없기 때문에 남겨 둡니다.

  • OpenCV 설치



    소스 코드에서 빌드했습니다.
    $ wget https://github.com/opencv/opencv/archive/3.4.3.zip -O opencv-3.4.3.zip
    $ wget https://github.com/opencv/opencv_contrib/archive/3.4.3.zip -O opencv_contrib-3.4.3.zip
    $ unzip opencv-3.4.3.zip
    $ unzip opencv_contrib-3.4.3.zip
    $ cd opencv-3.4.3
    $ mkdir build
    $ cd build
    $ ./cmake.sh
    $ make -j4
    $ sudo make install
    $ sudo ldconfig
    $ cd /path/to/site-packages
    $ sudo ln -s /usr/local/lib/python3.6/site-packages/cv2.cpython-36m-aarch64-linux-gnu.so cv2.so
    

    cmake는 많은 옵션이 있는 것과, 몇번이나 다시 했으므로 이하와 같이 파일로 해 두었습니다.

    cmake.sh
    #!/bin/sh
    cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF \
    -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=OFF \
    -D BUILD_opencv_gpucodec=OFF -D BUILD_opencv_gpufeatures2d=OFF \
    -D BUILD_opencv_gpufilters=OFF -D BUILD_opencv_gpuimgproc=OFF \
    -D BUILD_opencv_gpulegacy=OFF -D BUILD_opencv_gpuoptflow=OFF \
    -D BUILD_opencv_gpustereo=OFF -D BUILD_opencv_gpuwarping=OFF \
    -D BUILD_DOCS=OFF -D BUILD_TESTS=OFF \
    -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF \
    -D BUILD_opencv_python3=ON -D FORCE_VTK=ON \
    -D WITH_TBB=ON -D WITH_V4L=ON \
    -D WITH_OPENGL=ON -D WITH_CUBLAS=ON \
    -D BUILD_opencv_python3=ON \
    -D PYTHON3_EXECUTABLE=`pyenv local 3.6.8; pyenv which python` \
    -D PYTHON3_INCLUDE_DIR=`pyenv local 3.6.8; python -c 'from distutils.sysconfig import get_python_inc; print(get_python_inc())'` \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=`pyenv local 3.6.8; python -c 'import numpy; print(numpy.get_include())'` \
    -D PYTHON3_LIBRARIES=`find $PYENV_ROOT/versions/3.6.8/lib -name 'libpython*.so'` \
    -D WITH_FFMPEG=ON \
    ..
    
    

    내가 OpenCV에 익숙하지 않은 것에 약간 특수한 환경인 일도 있어서 별로 가지 않았다. 다음과 같은 점에서 집착했습니다.
  • libjasper-dev가 없어 에러가 나와 어떻게 하면 좋다고 고민했습니다. 하지만, 어딘가의 영어 게시판에 필수가 아니고 무리하고 있을 수 없어도 좋지 않다는 것이 쓰여 있었기 때문에 날렸습니다. JPEG 관계의 라이브러리인 것 같습니다. 게시판대로 넣지 않아도 빌드는 지나갔습니다.
  • cmake로 빌드한 뒤, import cv2 를 할 수 없어서 고민했습니다. 제대로 -D PYTHON3_hogehoge 옵션을 붙여서 python3 용의 Makefile로 받을 필요가있었습니다. cmake의 결과를 제대로 보지 않았습니다. .

  • matplotlib



    이미지 표시를 위해 matplotlib를 넣었습니다. backend가 non-GUI라고 하는 에러가 나왔으므로 아래와 같이 PyQt5를 넣었습니다. (시행착오하면서 했기 때문에 커맨드가 부족하다고 생각합니다..)
    $ sudo apt install -y qt5-qmake qt5-default
    $ wget https://sourceforge.net/projects/pyqt/files/sip/sip-4.19.12/sip-4.19.12.tar.gz
    $ wget https://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.10.1/PyQt5_gpl-5.10.1.tar.gz
    $ tar -xvf sip-4.19.12.tar.gz
    $ tar -xvf PyQt5_gpl-5.10.1.tar.gz
    $ cd sip-4.19.12/
    $ python configure.py --sip-module=PyQt5.sip
    $ make -j4
    $ sudo make install
    $ cd ../PyQt5_gpl-5.10.1/
    $ python configure.py --qmake /usr/bin/qmake --sip-incdir ~/deeplabcut/sip-4.19.12/siplib
    $ make
    $ sudo make install
    $ pip install pyqt5
    

    파이썬으로 동작 확인



    레나 씨의 얼굴 검출을 할 수 있을까? 를 소재로 OpenCV의 동작 확인을 했습니다.

    cvtest.py
    import cv2
    import matplotlib.pyplot as plt
    
    cascade_path = '/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml'
    
    def face_detection(img_src):
        img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
        cascade = cv2.CascadeClassifier(cascade_path)
        facerect = cascade.detectMultiScale(img_gray)
        if len(facerect) == 0:
            print('No face detected')
            return None
    
        rect = facerect[0]
        cv2.rectangle(
            img_src,
            tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]),
            (255, 255, 255),
            thickness=2)
        return img_src
    
    if __name__ == "__main__":
        lena_path = './lena.png'
        lena_src = cv2.imread(lena_path)
        lena_face_detected = face_detection(lena_src)
        if lena_face_detected is None:
            img_show = lena_src
        else:
            img_show = cv2.cvtColor(lena_face_detected, cv2.COLOR_BGR2RGB)
        plt.imshow(img_show)
        plt.show()
    

    다음이 실행 결과입니다. 무사히 검출할 수 있네요. 와이



    카메라가 도착하면 이것과 함께 놀고 싶습니다.

    이상입니다.

    좋은 웹페이지 즐겨찾기