最近頻繁重裝Ubuntu系統o(╥﹏╥)o,對重裝Ubuntu涉及的opencv做個總結。
Ubuntu安裝依賴項
cuda、cudnn等安裝這裏就不說了,主要爲通過終端執行的相關依賴項安裝指令,參考鏈接:
ubuntu 18.04編譯opencv3.4.3 with python3.6 cuda9.2 gdal
Ubuntu 18.04源碼編譯安裝OpenCV 4.0流程
sudo apt install -y build-essential cmake git pkg-config libopenexr-dev libblas-dev
sudo apt install -y python-dev python-numpy libtbb2 libtbb-dev
sudo apt install -y libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libjasper-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libavutil-dev
sudo apt install -y \
libx264-dev \
mesa-utils \
libgtk2.0-dev \
libxvidcore-dev \
yasm \
libxine2-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libv4l-dev \
libfaac-dev \
libmp3lame-dev \
libopencore-amrnb-dev \
libtheora-dev \
libvorbis-dev \
ffmpeg \
libeigen3-dev libeigen3-doc \
liblapack-dev \
tesseract-ocr \
tesseract-ocr-jpn \
libgflags-dev \
libleptonica-dev \
libtesseract-dev \
gphoto2 \
liblapacke-dev \
libgoogle-glog-dev \
libprotobuf-dev \
libprotoc-dev \
protobuf-compiler \
ccache \
libgphoto2-dev \
libavresample-dev \
libatlas-base-dev \
gfortran
下載安裝包
下載opencv源碼:opencv的github鏈接
下載opencv_contrib源碼:opencv_contrib的github鏈接(可以不用,看需要)
需要注意,如果要編譯contrib,需要使contrib的版本號與opencv對應。下載完成後均解壓,放置到自己的目標位置。
編譯opencv動態庫(so)
參考鏈接:openCV+opencv_contrib(編譯源碼)
在opencv的解壓文件中,創建編譯文件保存的文件夾,如build,並在該文件夾中打開終端,執行:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D WITH_TBB=ON \
-D WITH_OPENGL=ON \
-D BUILD_TIFF=ON -D WITH_TIFF=ON \
-D WITH_1394=OFF \
-D WITH_GDAL=ON \
-D WITH_CUDA=ON -D WITH_CUBLAS=ON -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES"\
-D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules/ \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D BUILD_EXAMPLES=OFF ..
以上爲舉例,目前還未完全測試各條命令有效性,後續更新。
其中PYTHON_DEFAULT_EXECUTABLE
爲要安裝opencv的python路徑,一般Ubuntu中都有多個版本的python;
CMAKE_INSTALL_PREFIX
是編譯後相關so文件的放置位置,這個最好保持該設置;
OPENCV_EXTRA_MODULES_PATH
爲opencv_contrib中modules的路徑,如果不準備編譯opencv_contrib可以刪除這一項。如果要編譯的話需要注意,在cuda10的時候,cudacodec會出現nvcuvid.h找不到的情況,我將cudacodec模塊刪掉可以正常編譯,目前最新的opencv_contrib在2018年12月18日已修復了該bug,如果是使用該時間之後的版本應該可以正常編譯。
生成makefile文件後,即可執行make操作,如果發現生成表中有數據不對或者生成出錯,需要將該文件夾中相關文件刪除,再修改cmake指令後重新生成:
# 查找該機器可使用的編譯線程數
nproc
# 假如輸出是8, 執行8線程編譯
make -j8
sudo make install
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
編譯opencv靜態庫(a)
參考鏈接:Ubuntu16.04下編譯OpenCV2.4.13靜態庫(.a文件)
有的項目需要使用opencv的.a靜態庫,動態庫能生成部分.a文件,但是不完整,因此找了下生成靜態庫的方法。
與創建動態庫相同,在opencv文件夾中創建生成文件的文件夾,如static_release,並在該文件夾中打開終端,執行cmake命令:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_SHARED_LIBS=NO \
-D BUILD_PNG=ON \
-D BUILD_JASPER=ON \
-D BUILD_JPEG=ON \
-D BUILD_TIFF=ON \
-D BUILD_ZLIB=ON \
-D WITH_JPEG=ON \
-D WITH_PNG=ON \
-D WITH_JASPER=ON \
-D WITH_TIFF=ON ..
可以仿照動態庫的cmake命令,主要是添加BUILD_SHARED_LIBS=NO
,代表不編譯動態庫而是編譯靜態庫,編譯結束後就可以在/usr/local/lib/看到生成的一系列.a文件。
測試
安裝完成後可以通過pkg-config opencv --modversion
查看opencv是否安裝成功及版本號。
測試代碼可以仿照Ubuntu 18.04源碼編譯安裝OpenCV 4.0流程開啓攝像頭/視頻,或者像ubuntu 16.04 OpenCV3.2.0完全編譯安裝打開一張圖片。
首先創建DisplayImage.cpp文件,輸入:
#include <cv.h>
#include <highgui.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main( int argc, char** argv )
{
Mat image;
image = imread( argv[1], 1 );
if( argc != 2 || !image.data )
{
printf( "No image data \n" );
return -1;
}
namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
imshow( "Display Image", image );
waitKey(0);
return 0;
}
創建CMakeLists.txt 文件,輸入:
project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
在該文件夾下打開終端,執行:
cmake .
make
即可生成一個DisplayImage的執行文件,執行./DisplayImage test.jpg即可打開圖片, test.jpg爲該文件夾下放置的一張圖像,也可以指定到其它路徑中的圖像。
卸載
cd /usr
sudo find . -name "*opencv*" | xargs sudo rm -rf