Ubuntu 18.04에 OpenCV 4.2 설치

Speedwell🍀·2022년 2월 16일
1

Human Following Robot

목록 보기
10/18

$ pkg-config --modversion opencv로 opencv 버전을 확인해보니 3.2.0이 깔려있었다. 이걸 지우고 4.2를 설치해보자.

기존 opencv를 삭제하기 위해 아래의 명령어를 입력하면 된다.

$ sudo apt-get purge libopencv* python-opencv
$ sudo apt-get autoremove
$ sudo find /usr/local/ -name "*opencv*" -exec rm -i {} \;

이제 기존 패키지를 업데이트 해주자.

$ sudo apt-get update
$ sudo apt-get upgrade

  • build-essential: C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함

  • cmake: 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정 등을 위해 필요 (나는 앞에서 미리 깔아서 이건 안했음)

  • pkg-config: 프로그램 컴파일 및 링크시 필요한 라이브러리에 대한 정보를 메타파일(확장자가 .pc 인 파일)로부터 가져오는데 사용됨. 터미널에서 특정 라이브러리를 사용한 소스코드를 컴파일시 필요한 컴파일러 및 링커 플래그를 추가하는데 도움이 됨.

  • libjpeg-dev, libtiff5-dev, libpng-dev : 특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요

  • libavcodec-dev, libavformat-dev, libswscale-dev, libxvidcore-dev, libx264-dev, libxine2-dev: 특정 코덱의 비디오 파일을 읽어오거나 기록하기 위해 필요

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

  • libgstreamer1.0-dev, libgstreamer-plugins-base1.0-dev: 비디오 스트리밍을 위한 라이브러리

  • libgtk2.0-dev: highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 비디오를 보여줄 수 있음. 윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용 가능. 여기서는 gtk2를 지정함 (다른 가능한 패키지: libgtk-3-dev, libqt4-dev, libqt5-dev)
    3.2.0

  • mesa-utils, libgl1-mesa-dri, libgtkgl2.0-dev, libgtkglext1-dev: OpenGL 지원하기 위해 필요

  • libatlas-base-dev, gfortran, libeigen3-dev: OpenCV 최적화하기 위해 필요

  • python2.7-dev, python3-dev: OpenCV-Python 바인딩 위해 필요

  • python-numpy, python3-numpy: numpy는 매트릭스 연산 등을 빠르게 처리 가능

$ sudo apt-get install build-essential cmake
$ sudo apt-get install pkg-config
$ sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev
$ sudo apt-get install libv4l-dev v4l-utils
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
$ sudo apt-get install libgtk2.0-dev
$ sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev
$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev
$ sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy

이제 opencv를 빌드하자.
먼저 디렉터리를 생성한다.

$ mkdir opencv
$ cd opencv

그 후 opencv와 opencv-contrib를 다운받는다.

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

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

다음으로 opencv 디렉터리 안으로 이동해서 빌드할 디렉터리 생성.

$ cd opencv-4.2.0
$ mkdir build
$ cd build

다음으로 cmake를 설정 (수정 필요)

$ 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 WITH_QT=OFF \
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.2.0/modules \
-D WITH_V4L=ON \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D PYTHON2_INCLUDE_DIR=/usr/include/python2.7 \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \
-D PYTHON2_PACKAGES_PATH=/usr/lib/python2.7/dist-packages \
-D PYTHON2_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
-D PYTHON3_INCLUDE_DIR=/usr/include/python3.7 \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include/ \
-D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
-D PYTHON3_LIBRARY=/[Makefile] make: *** [test] Error 1usr/lib/x86_64-linux-gnu/libpython3.7.so \
../

이제 $ cat /proc/cpuinfo | grep processor | wc -l을 입력해서 cpu 코어 수를 확인하자. 나는 16이 출력됐는데 그럼 $ make -j16이라고 입력하면 된다.

이 과정에서 계속 Python.h가 없다면서 [Makefile] make: *** [test] Error 1 이런 에러가 계속 출력되었다. cmake를 재설치도 해보고 numpy 재설치도 해보고 sudo apt install python-dev도 해보고 온갖 방법을 해봤지만 안됐다.
Python.h가 없다는 파일의 경로로 가서 $ sudo vi 파일명을 해서 직접 Python.h의 경로를 절대경로로 다 바꿔줬더니 해결됐다. ➡ cmake 설정을 다시 해주니 해결됐다! 앞의 방법은 비추천. -D PYTHON 부분을 수정해줬다.


cmake의 경로를 설정해주기 위해서 아래 내용을 했다.

terminal에서 $ python 실행시켜서 import syssys.prefix를 입력하면 경로가 나온다. 그걸 -D CMAKE_INSTALL_PREFIX= 뒤에 넣는다. 또 sys.executable을 입력해서 나온 경로를 -D PYTHON_EXECUTABLE= 뒤에 넣는다. import sysconfig를 한 후, sysconfig.get_config_var('LIBDEST')를 입력해서 나온 경로를 -D PYTHON3_PACKAGES_PATH= 뒤에 넣는다.

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_ENABLE_NONFREE=OFF \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib-4.2.0/modules \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D BUILD_DOCS=OFF \
-D BUILD_SHARED_LIBS=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D WITH_CUDA=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUDNN=ON \
-D CUDA_FAST_MATH=1 \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=7.5 \
-D CUDA_ARCH_PTX=7.5 \
-D WITH_VTK=ON \
-D WITH_OPENCL=ON \
-D OPENCV_SKIP_PYTHON_LOADER=ON \
-D PYTHON_EXECUTABLE=~/anaconda3/envs/yolov4/bin/python3.7 \
-D PYTHON3_INCLUDE_DIR=~/anaconda3/envs/yolov4/include/python3.7m \
-D PYTHON3_NUMPY_INCLUDE_DIRS=~/anaconda3/envs/yolov4/lib/python3.7/site-packages/numpy/core/include \
-D PYTHON3_PACKAGES_PATH=~/anaconda3/envs/yolov4/lib/python3.7 \
-D PYTHON3_LIBRARY=~/anaconda3/envs/yolov4/lib/libpython3.7m.so \
-D PYTHON_LIBRARIES=~/anaconda3/envs/yolov4/lib/python3.7 ../

cmake를 위와 같이 변경해서 성공했다. 앞선 cmake는 경로 설정이 잘못 되어있어서 에러가 많이 뜬 것 같다.

경로 설정을 잘하자!!

$ make -j16을 해준 후, $ sudo make install을 해주고, $ cat /etc/ld.so.conf.d/*를 입력해서 /usr/local/lib가 있는지 확인한다. 있으면 $ sudo ldconfig를 해주면 완료!


터미널에서 파이썬을 실행시켜서 import cv2를 해보니까 ImportError: numpy.core.multiarray failed to import 에러가 떴다. 찾아보니까 pip와 numpy 버전 업데이트를 해주면 된다고 해서 터미널에서 $ pip install --upgrade pip pip install --upgrade numpy를 해주고 다시 import cv2를 하니까 에러가 사라졌다. 그 후 cv2.__version__을 해보니 4.2.0이 잘 출력되었다.


그런데$ pkg-config --modversion opencv4로 버전을 확인해보니 이번엔 아래와 같은 메시지가 출력됐다.

Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

해결) /usr/local/lib/pkgconfig 밑에 opencv.pc 파일이 없는데, 직접 추가해줘도 된다고 해서 직접 추가했다.

https://cv-tricks.com/installation/opencv-4-1-ubuntu18-04/

$ cd /usr/local/lib/pkgconfig
$ sudo vi opencv4.pc

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv4/opencv
includedir_new=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.2.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_video -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt -L/usr/lib/x86_64-linux-gnu -lGL -lGLU
Cflags: -I${includedir_old} -I${includedir_new}

opencv.pc 파일을 생성해 위 내용을 작성해줬더니 해결됐다.
이제 pkg-config --modversion opencv4를 해주면 이제 4.2.0이 출력된다.

0개의 댓글