오픈 하드웨어/라즈베리파이

python 3.9.2에 opencv 4.6.0설치

hujoo 2023. 5. 24. 00:48

1. 사전준비

pi@raspberrypi:~ $ sudo apt update 

pi@raspberrypi:~ $ sudo apt upgrade

pi@raspberrypi:~ $ sudo reboot

 

2. OpenCV 필용 패키지 설치

cmake는 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정등을 위해 필요 

$ sudo apt install build-essential cmake

 

cmake는 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정등을 위해 필요 

$ sudo apt install build-essential cmake

 

특정 코덱의 비디오 파일/스트리밍을 읽어오거나 기록하기 위해 필요한 FFmpeg 관련 패키지들

$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev

 

Video4Linux 패키지는 리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함 

$ sudo apt install libv4l-dev v4l-utils

 

특정 코덱의 비디오 파일/스트리밍을 읽어오거나 기록하기 위해 필요한 GStreamer 관련 패키지들

$ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly

 

OpenCV에서는 highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 영상을 보여줌  

윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능합니다.  본 글에서는  gtk3를 사용 

$ sudo apt install libgtk-3-dev

 

OpenCV 최적화를 위해 사용되는 라이브러리들

$ sudo apt install libatlas-base-dev gfortran libeigen3-dev

 

python3-dev 패키지는 파이썬을 위한 헤더파일과 라이브러리가 포함된  패키지들

Numpy는 매트릭스 연산등을 빠르게 처리할 수 있어서 OpenCV Python에서 사용

$ sudo apt install python3-dev python3-numpy

 

3. OpenCV 설정과 컴파일 및 설치

소스 코드를 저장할 임시 디렉토리를 생성하여 이동 후.. 진행

pi@raspberrypi:~ $ mkdir opencv

pi@raspberrypi:~ $ cd opencv

pi@raspberrypi:~/opencv $

 

OpenCV 4.6.0 소스코드를 다운로드 받아 압축을 풀어줌

$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.6.0.zip

$ unzip opencv.zip

 

opencv_contrib(extra modules) 소스코드를 다운로드 받아 압축을 풀어줌

SURF 등을 사용하기 위해 필요 

$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.6.0.zip

$ unzip opencv_contrib.zip

 

다음처럼 두 개의 디렉토리가 생성

pi@raspberrypi:~/opencv $  ls -d */

opencv-4.6.0  opencv_contrib-4.6.0

 

opencv-4.6.0 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동

컴파일은 build 디렉토리에서 이루어짐

pi@raspberrypi:~/opencv $  cd opencv-4.6.0

pi@raspberrypi:~/opencv/opencv-4.6.0 $  mkdir build

pi@raspberrypi:~/opencv/opencv-4.6.0 $  cd build

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ 

 

Python이 라이브러리를 인식하는 위치를 확인합니다. 여기에선 보라색으로 표시한 경로입니다. 

$ python3 -m site

sys.path = [

    '/home/pi/opencv/opencv-4.6.0/build',

    '/usr/lib/python39.zip',

    '/usr/lib/python3.9',

    '/usr/lib/python3.9/lib-dynload',

    '/usr/local/lib/python3.9/dist-packages',

    '/usr/lib/python3/dist-packages',

    '/usr/lib/python3.9/dist-packages',

]

USER_BASE: '/home/pi/.local' (exists)

USER_SITE: '/home/pi/.local/lib/python3.9/site-packages' (doesn't exist)

ENABLE_USER_SITE: True

 

cmake를 사용하여 OpenCV 컴파일 설정.  복사해서 터미널에 붙여넣기. 

 

다음 옵션은 빌드할 OpenCV 버전에 맞추어 아래 경로중 빨간색 부분을 변경

-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules 

 

보라색으로 표시한 부분은 Python의 라이브러리 찾는 경로로 sys.path 경로로 변경. 

 

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=OFF -D WITH_IPP=OFF -D WITH_1394=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D ENABLE_NEON=ON -D ENABLE_VFPV3=ON -D WITH_QT=OFF -D WITH_GTK=ON -D WITH_OPENGL=ON -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules -D WITH_V4L=ON -D WITH_FFMPEG=ON -D WITH_XINE=ON -D ENABLE_PRECOMPILED_HEADERS=OFF -D BUILD_NEW_PYTHON_SUPPORT=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D PYTHON3_PACKAGES_PATH=/usr/local/lib/python3.9/dist-packages ../

 

다음처럼 cmake 실행 중에  추가적인 다운로드가  있음.  

라즈베리파이에 인터넷이 연결된 상태에서 진행.

-- xfeatures2d/boostdesc: Download: boostdesc_bgm.i

-- xfeatures2d/boostdesc: Download: boostdesc_bgm_bi.i

-- xfeatures2d/boostdesc: Download: boostdesc_bgm_hd.i

-- xfeatures2d/boostdesc: Download: boostdesc_binboost_064.i

-- xfeatures2d/boostdesc: Download: boostdesc_binboost_128.i

-- xfeatures2d/boostdesc: Download: boostdesc_binboost_256.i

-- xfeatures2d/boostdesc: Download: boostdesc_lbgm.i

-- xfeatures2d/vgg: Download: vgg_generated_48.i

-- xfeatures2d/vgg: Download: vgg_generated_64.i

-- xfeatures2d/vgg: Download: vgg_generated_80.i

-- xfeatures2d/vgg: Download: vgg_generated_120.i

-- data: Download: face_landmark_model.dat

 

다음과 같은 메시지가 보이면 정상적으로 된 것입니다.

-- Configuring done

-- Generating done

-- Build files have been written to: /home/pi/opencv/opencv-4.6.0/build

 

cmake 실행 결과

.

.

.

-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv/opencv-4.6.0/build

 

진행하기 전에 스왑(swap) 공간을 늘려줘야 멀티코어를 사용하여 컴파일시 메모리 부족으로 에러가 나지않.

/etc/dphys-swapfile 파일을 열어서 

$ sudo nano /etc/dphys-swapfile

 

CONF_SWAPSIZE  변수값을 100에서 2048로 수정.

Ctrl + O를 눌러 저장하고 Ctrl + X를 눌러 빠져나옴. 

# set size to absolute value, leaving empty (default) then uses computed value

#   you most likely don't want this, unless you have an special disk situation

# CONF_SWAPSIZE=100

CONF_SWAPSIZE=2048

 

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ free

               total        used        free      shared  buff/cache   available

Mem:         3930860      179928     1751316       36172     1999616     3554424

Swap:         102396           0      102396

 

스왑 관련 서비스를 재시작.

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ sudo /etc/init.d/dphys-swapfile restart

[ ok ] Restarting dphys-swapfile (via systemctl): dphys-swapfile.service.

 

Swap이 2048메가로 바뀜. 

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ free

               total        used        free      shared  buff/cache   available

Mem:         3930860      181864      109168       36872     3639828     3551788

Swap:        2097148           0     2097148

 

이제 make 명령을 사용하여 컴파일을 시작합니다.  -j4 옵션을 주고 우선 진행.   

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ time make -j4

 

4. OpenCV 설치 결과 확인

C/C++

현재 위치로 웹캠을 보여주는 샘플 코드를 가져옴

$ cp  /usr/local/share/opencv4/samples/cpp/videocapture_basic.cpp .

 

컴파일

$ g++ -o videocapture_basic videocapture_basic.cpp $(pkg-config opencv4 --libs --cflags)

 

테스트를 하기 위해  필요한 웹캠 또는 Raspberry Pi Camera(pi camera)를  Raspberry Pi에  연결

대부분의 웹캠은 연결후 dmesg | tail 명령어로 해당 웹캠을 확인시 다음처럼 문제 없이 인식가능 

인식이 안되면 해당 웹캠을 위한 디바이스 드라이버를 설치해줘야 함

 

다음처럼 /dev/video0 디바이스 파일이 생성되었는지 확인

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ ls /dev/video*

/dev/video0

 

파이 카메라의 경우에는 다음 명령으로 /dev/video0 장치를 만들어줌

sudo modprobe bcm2835-v4l2

 

자세한 내용은 아래 포스팅을 참고

Raspberry Pi Camera Module( pi camera )를 위해 /dev/video0 생성하는 방법

http://webnautes.tistory.com/1192 

 

파이 카메라의 경우 추가로 소스코드를 수정. open 함수의 아규먼트를 -1로 해야 정상적으로 동작. 0으로 하면 카메라를 열지 못하고 무한 대기 상태에 빠짐. 

//cap.open(deviceID + apiID);

cap.open(-1);

 

실행시켜보면 웹캠 영상이 보임. 

$ ./videocapture_basic

 

실행에 문제가 있는 경우 웹캠을 연결한채 재부팅하고나서 VNC를 사용하여 진행.

 

Raspberry Pi 4를 VNC로 접속하여 원격 제어하는 방법

https://webnautes.tistory.com/549 

 

Python

python 3에서 opencv 라이브러리를 사용가능한지는 확인.

OpenCV 버전이 출력.

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ python3

Python 3.9.2 (default, Mar 12 2021, 04:06:34) 

[GCC 10.2.1 20210110] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import cv2

>>> cv2.__version__

'4.6.0'

>>> quit()

 

파이 카메라의 경우  0 대신에 다음처럼 -1을 사용. 

cap = cv.VideoCapture(-1)

 

예제 코드를 실행. 웹캠 영상을 볼 수 있슴. 

$ python3 /usr/local/share/opencv4/samples/python/video.py



C++때와 똑같은 에러가 나지만 영상은 보임

[ WARN:0] global /home/pi/opencv/opencv-4.5.1/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1




이제 필요 없어진 컴파일에 사용했던 opencv 소스코드 디렉토리를 삭제.

 

pi@raspberrypi:~/opencv/opencv-4.6.0/build $ cd

pi@raspberrypi:~ $ rm -rf opencv

 

 

참고 사이트 : https://webnautes.tistory.com/916