Ubuntu:編譯安裝OpenCV4

1. 進(jìn)入官網(wǎng),下載opencv4源碼、contrib源碼

各個(gè)版本鏈接:

contrib:https://github.com/opencv/opencv_contrib/releases

oepncv: https://opencv.org/releases.html


安裝依賴

sudo apt-get install build-essential

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

檢查自己安裝的gcc、cmake的版本是否太低。



2. 按下面鏈接安裝cuda和cudnn;

https://blog.csdn.net/sss_369/article/details/94591280

https://blog.csdn.net/sss_369/article/details/94592268

安裝和Nvidia驅(qū)動(dòng)相匹配的cuda和cudnn



3. 安裝cmake:

https://blog.csdn.net/sss_369/article/details/94666494

4. cmake編譯opencv:

(1)先安裝依賴

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

這里如果遇到如下問題:

下列軟件包有未滿足的依賴關(guān)系:libgtk2.0-dev : 依賴: libgtk2.0-0 (= 2.24.30-1ubuntu1) 但是 2.24.30-1ubuntu1.16.04.2 正要被安裝依賴: libglib2.0-dev (>= 2.27.3) 但是它將不會(huì)被安裝依賴: libgdk-pixbuf2.0-dev (>= 2.21.0) 但是它將不會(huì)被安裝依賴: libpango1.0-dev (>= 1.20) 但是它將不會(huì)被安裝依賴: libatk1.0-dev (>= 1.29.2) 但是它將不會(huì)被安裝依賴: libcairo2-dev (>= 1.6.4-6.1) 但是它將不會(huì)被安裝依賴: libxcursor-dev 但是它將不會(huì)被安裝推薦: debhelper 但是它將不會(huì)被安裝libjasper-dev : 依賴: libjasper1 (= 1.900.1-debian1-2.4ubuntu1) 但是 1.900.1-debian1-2.4ubuntu1.1 正要被安裝E: 無法修正錯(cuò)誤,因?yàn)槟竽承┸浖3脂F(xiàn)狀,就是它們破壞了軟件包間的依賴關(guān)系。

解決:出現(xiàn)上述錯(cuò)誤是因?yàn)槟壳笆褂玫脑吹陌姹颈容^低,而要安裝的軟件的依賴的版本的較高,因此方法只能是更換源.

運(yùn)行sudo gedit /etc/apt/sources.list,將Ubuntu的源替換為:

deb?http://cn.archive.ubuntu.com/ubuntu/?xenial main restricted universe multiverse

deb?http://cn.archive.ubuntu.com/ubuntu/?xenial-security main restricted universe multiverse

deb?http://cn.archive.ubuntu.com/ubuntu/?xenial-updates main restricted universe multiverse

deb?http://cn.archive.ubuntu.com/ubuntu/?xenial-backports main restricted universe multiverse


選擇opencv源文件所在路徑;

選擇輸出build文件所在路徑;

選擇contrib_modues的路徑;contrib/modues/

勾選opencv_enable_nonfree;不然nonfree用不起來;

勾選cuda選項(xiàng);




點(diǎn)擊config,如無錯(cuò)誤再勾選generate;

opencv4在編譯時(shí)會(huì)下載一個(gè)名為ippicv_2019_lnx_intel64_general_20180723的文件;

導(dǎo)致編譯時(shí)間長;


我采用先離線下載下來,編譯時(shí)直接從本地加載;

5. 從本地加載 ippicv_2019_lnx_intel64_general_20180723:

在opencv4源碼包里找到ippic.cmake文件;

/opencv_source/opencv/3rdparty/ippicv/ippicv.cmake


將47行的如下指令改為:

修改前:

"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"

修改后:file后是文件路徑

6. 進(jìn)入編譯的build目錄,進(jìn)行安裝:

make

sudo make install


7. opencv環(huán)境配置:

首先將OpenCV的庫添加到路徑,從而可以讓系統(tǒng)找到

sudo gedit /etc/ld.so.conf.d/opencv.conf

執(zhí)行此命令后打開的可能是一個(gè)空白的文件,不用管,只需要在文件末尾添加

/usr/local/lib


執(zhí)行如下命令使得剛才的配置路徑生效

sudo ldconfig

配置bash

sudo gedit /etc/bash.bashrc

在末尾追加:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig?

export PKG_CONFIG_PATH

保存,執(zhí)行如下命令使得配置生效:

source /etc/bash.bashrc

更新:

sudo updatedb


至此,所有配置都已經(jīng)完成。



8. opencv測(cè)試:

surf.cpp

#include <opencv2/opencv.hpp>

#include <opencv2/xfeatures2d.hpp>

#include <iostream>

using namespace cv;

using namespace cv::xfeatures2d;? ? ? ? // 不要忘了導(dǎo)入擴(kuò)展模塊

using namespace std;

Mat src_img, gray_img;

const string output_name = "SURF特征檢測(cè)";

int minHessian = 100;? ? ? ? ? ? ? ? // 定義SURF中的hessian閾值特征點(diǎn)檢測(cè)算子

int max_value = 500;

void SURF_detect_func(int, void *)

{

// SURF特征檢測(cè)

Ptr<SURF> detector = SURF::create(minHessian);

vector<KeyPoint> keypoints;

detector->detect(gray_img, keypoints, Mat());? ? ? // 檢測(cè)src_img圖像中的SURF特征

? // 繪制關(guān)鍵點(diǎn)

Mat keypoint_img;

drawKeypoints(gray_img, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT);? // Scalar::all(-1)這是一種技巧,就是當(dāng)用一個(gè)負(fù)數(shù)作為關(guān)鍵點(diǎn)顏色,表示每次隨機(jī)選取顏色。

imshow(output_name, keypoint_img);

}

int main()

{

src_img = imread("1.png");

if (src_img.empty())

{

printf("could not load the image...\n");

return -1;

}

namedWindow("原圖", WINDOW_AUTOSIZE);

imshow("原圖", src_img);

cvtColor(src_img, gray_img, COLOR_BGR2GRAY);

namedWindow(output_name, WINDOW_AUTOSIZE);

createTrackbar("hessian閾值", output_name,&minHessian, max_value, SURF_detect_func);

SURF_detect_func(0,0);

waitKey(0);

return 0;

}



CMakeLists.txt:

# 聲明要求的 cmake 最低版本

cmake_minimum_required( VERSION 2.8 )

# 聲明一個(gè) cmake 工程

project( opencv_test )

# 設(shè)置編譯模式

set( CMAKE_BUILD_TYPE "Debug" )

set(CMAKE_CXX_FLAGS? "-std=c++11")

find_package(OpenCV 4.1 REQUIRED)

# 添加一個(gè)可執(zhí)行程序

# 語法:add_executable( 程序名 源代碼文件 )

add_executable( test surf.cpp )

# 將庫文件鏈接到可執(zhí)行程序上

target_link_libraries( test ${OpenCV_LIBS} )



9. opencv_cuda_test測(cè)試是否可用gpu加速

main.cpp

//main.cpp

#include <iostream>

#include <opencv2/opencv.hpp>

#include <opencv2/core/version.hpp>

#include <opencv2/cudaarithm.hpp>

int main (int argc, char* argv[])

{

? ? try

? ? {

? ? ? ? /// 讀取圖片

? ? ? ? cv::Mat src_host = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);

? ? ? ? /// 定義GpuMat

? ? ? ? cv::cuda::GpuMat dst, src;

? ? ? ? /// 將主機(jī)內(nèi)存的圖像數(shù)據(jù)上傳到GPU內(nèi)存

? ? ? ? src.upload(src_host);

? ? ? ? /// 調(diào)用GPU的閾值函數(shù)(很多使用GPU加速的函數(shù)都和CPU版本的函數(shù)相同)

? ? ? ? cv::cuda::threshold(src, dst, 120, 255, cv::THRESH_BINARY);

? ? ? ? cv::Mat result_host;

? ? ? ? /// 從GPU上下載閾值化完成的圖片

? ? ? ? dst.download(result_host);

? ? ? ? /// 顯示

? ? ? ? cv::imshow("Result", result_host);

? ? ? ? cv::waitKey();

? ? }

? ? catch(const cv::Exception& ex)

? ? {

? ? ? ? std::cout << "Error: " << ex.what() << std::endl;

? ? }

? ? return 0;

}



CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(cuda_test)

#這一句解決 cannot find -lopencv_dep_cudart

set(CUDA_USE_STATIC_CUDA_RUNTIME ON)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})

find_package(CUDA REQUIRED)

message(STATUS "CUDA版本: ${CUDA_VERSION}")

message(STATUS "? ? 頭文件目錄:${CUDA_INCLUDE_DIRS}")

message(STATUS "? ? 庫文件列表:${CUDA_LIBRARIES}")

set(CUDA_NVCC_FLAGS -G;-g;-std=c++11) # nvcc flags

include_directories(${CUDA_INCLUDE_DIRS})

# 指定OpenCV安裝路徑來區(qū)分不同的OpenCV版本

set(OpenCV_DIR "/usr/local/share/OpenCV")

find_package(OpenCV REQUIRED)

set(OpenCV_LIB_DIR ${OpenCV_INSTALL_PATH}/lib)

message(STATUS "OpenCV版本: ${OpenCV_VERSION}")

message(STATUS "? ? 頭文件目錄:${OpenCV_INCLUDE_DIRS}")

message(STATUS "? ? 庫文件目錄:${OpenCV_LIB_DIR}")

message(STATUS "? ? 庫文件列表:${OpenCV_LIBS}")

include_directories(${OpenCV_INCLUDE_DIRS})

link_directories(${OpenCV_LIB_DIR})

CUDA_ADD_EXECUTABLE(main main.cpp)

target_link_libraries(main ${OpenCV_LIBS} ${CUDA_LIBRARIES})


參考

1.https://blog.csdn.net/sss_369/article/details/94755824

2.https://blog.csdn.net/xykenny/article/details/91956986

3. https://blog.csdn.net/whut54/article/details/88012854

4. http://www.itdecent.cn/p/f646448da265

5. https://blog.csdn.net/wang3141128/article/details/80483459

6. https://www.douban.com/note/717360543/

7.https://blog.csdn.net/DumpDoctorWang/article/details/81032914

8.https://blog.csdn.net/zseqsc_asd/article/details/82777224

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容