目錄
在Linux下編譯自己的opencv庫,個人覺得用cmake編譯最好了,其主要是opencv源碼路徑下提供了CMakeLists.txt文件用於編譯,而且使用cmake編譯很方便。
這是opencv在linux下的編譯官方tutorial:https://docs.opencv.org/3.4.0/d7/d9f/tutorial_linux_install.html,本文很多地方都是直接進行翻譯的。
1. 安裝相關庫
在正式編譯之前,先打開終端輸入下面幾個命令,安裝幾個與opencv有關的庫,注:安裝需在連網情況下進行。
[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
2. 下載源碼並解壓:
tar zxvf 文件名.tar
3. 配置
cd ~/opencv-3.4.3 # 進入opencv文件夾
mkdir build # 創建build文件夾
cd build # 進入build文件夾
# CMAKE_BUILD_TYPE=Release表示編譯的版本,CMAKE_INSTALL_PREFIX:表示生成的include和lib文件#夾路徑,注意,後面的兩個點千萬不能省,代表了上級目錄,這一步是cmake的配置過程
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
CMAKE_BUILD_TYPE爲版本,設置爲release版本,CMAKE_INSTALL_PREFIX爲生成的庫文件路徑,/usr/local是系統默認路徑,許多第三方庫都安裝在這個目錄下面,.so文件都安裝在/usr/local/lib目錄下面,最好不要換其他路徑,否則很容易導致找不到.so庫的問題。如果上面的配置命令無效,則嘗試將空格去掉試試,使用以下命令:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..
4.編譯
編譯,網上很多教程都是多線程編譯的,我這裏不是很推薦,我嘗試過多線程編譯很容易出問題,最好還是使用單線程,這一步比較耗時,耐心等待編譯完成。
make -j1
5.生成庫文件
安裝庫文件,即生成.so
sudo make install
sudo make install 這一步生成所需要的頭文件和.so文件,根據上面的設置,頭文件在“usr/local/include”中,.so文件夾在“usr/local/lib”文件夾中,還有一些可執行文件在“usr/local/bin”文件夾中,生成的文件目錄如下圖所示:
使用cmake-gui編譯設置:
- set full path to OpenCV source code, e.g. /home/user/opencv:源碼路徑
- set full path to <cmake_build_dir>, e.g. /home/user/opencv/build:編譯生成文件的路徑
- set optional parameters
- run: “Configure”
- run: “Generate”
編譯CUDA版opencv
編譯CUDA版本的opencv只在第三步配置階段有所不同,其他過程都一樣,CUDA版本的配置命令如下:
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DWITH_CUDA=ON \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DINSTALL_PYTHON_EXAMPLES=ON \
-DBUILD_EXAMPLES=ON \
-DCUDA_GENERATION=Maxwell .. //Tx1爲maxwell架構,tx2爲pascal架構
這裏-DWITH_CUDA=ON 表示開啓cuda的相關功能,-DCUDA_GENERATION=Maxwell中的Maxwell代表的是機器上顯卡的架構。
在opencv3.4.7版本的OpenCVDetectCUDA.cmake文件中,顯示了多種顯卡架構類型:
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "2.0")
elseif(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
elseif(CUDA_GENERATION STREQUAL "Maxwell")
set(__cuda_arch_bin "5.0 5.2")
elseif(CUDA_GENERATION STREQUAL "Pascal")
set(__cuda_arch_bin "6.0 6.1")
elseif(CUDA_GENERATION STREQUAL "Volta")
set(__cuda_arch_bin "7.0")
elseif(CUDA_GENERATION STREQUAL "Turing")
set(__cuda_arch_bin "7.5")
elseif(CUDA_GENERATION STREQUAL "Auto")
歷代顯卡架構:Tesla時代——》Fermi時代——》Kepler時代——》Maxwell時代
參考: