python 3.9.2에 opencv 4.6.0설치
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