$ 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가 없다는 파일의 경로로 가서 ➡ cmake 설정을 다시 해주니 해결됐다! 앞의 방법은 비추천. $ sudo vi 파일명
을 해서 직접 Python.h의 경로를 절대경로로 다 바꿔줬더니 해결됐다.-D PYTHON
부분을 수정해줬다.
cmake의 경로를 설정해주기 위해서 아래 내용을 했다.
terminal에서 $ python
실행시켜서 import sys
후 sys.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이 출력된다.