Ubuntu:编译安装OpenCV4

1. 进入官网,下载opencv4源码、contrib源码

各个版本链接:

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驱动相匹配的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

这里如果遇到如下问题:

下列软件包有未满足的依赖关系:libgtk2.0-dev : 依赖: libgtk2.0-0 (= 2.24.30-1ubuntu1) 但是 2.24.30-1ubuntu1.16.04.2 正要被安装依赖: libglib2.0-dev (>= 2.27.3) 但是它将不会被安装依赖: libgdk-pixbuf2.0-dev (>= 2.21.0) 但是它将不会被安装依赖: libpango1.0-dev (>= 1.20) 但是它将不会被安装依赖: libatk1.0-dev (>= 1.29.2) 但是它将不会被安装依赖: libcairo2-dev (>= 1.6.4-6.1) 但是它将不会被安装依赖: libxcursor-dev 但是它将不会被安装推荐: debhelper 但是它将不会被安装libjasper-dev : 依赖: libjasper1 (= 1.900.1-debian1-2.4ubuntu1) 但是 1.900.1-debian1-2.4ubuntu1.1 正要被安装E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

解决:出现上述错误是因为目前使用的源的版本比较低,而要安装的软件的依赖的版本的较高,因此方法只能是更换源.

运行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选项;




点击config,如无错误再勾选generate;

opencv4在编译时会下载一个名为ippicv_2019_lnx_intel64_general_20180723的文件;

导致编译时间长;


我采用先离线下载下来,编译时直接从本地加载;

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. 进入编译的build目录,进行安装:

make

sudo make install


7. opencv环境配置:

首先将OpenCV的库添加到路径,从而可以让系统找到

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

执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加

/usr/local/lib


执行如下命令使得刚才的配置路径生效

sudo ldconfig

配置bash

sudo gedit /etc/bash.bashrc

在末尾追加:

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

export PKG_CONFIG_PATH

保存,执行如下命令使得配置生效:

source /etc/bash.bashrc

更新:

sudo updatedb


至此,所有配置都已经完成。



8. opencv测试:

surf.cpp

#include <opencv2/opencv.hpp>

#include <opencv2/xfeatures2d.hpp>

#include <iostream>

using namespace cv;

using namespace cv::xfeatures2d;        // 不要忘了导入扩展模块

using namespace std;

Mat src_img, gray_img;

const string output_name = "SURF特征检测";

int minHessian = 100;                // 定义SURF中的hessian阈值特征点检测算子

int max_value = 500;

void SURF_detect_func(int, void *)

{

// SURF特征检测

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

vector<KeyPoint> keypoints;

detector->detect(gray_img, keypoints, Mat());      // 检测src_img图像中的SURF特征

  // 绘制关键点

Mat keypoint_img;

drawKeypoints(gray_img, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT);  // Scalar::all(-1)这是一种技巧,就是当用一个负数作为关键点颜色,表示每次随机选取颜色。

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 )

# 声明一个 cmake 工程

project( opencv_test )

# 设置编译模式

set( CMAKE_BUILD_TYPE "Debug" )

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

find_package(OpenCV 4.1 REQUIRED)

# 添加一个可执行程序

# 语法:add_executable( 程序名 源代码文件 )

add_executable( test surf.cpp )

# 将库文件链接到可执行程序上

target_link_libraries( test ${OpenCV_LIBS} )



9. opencv_cuda_test测试是否可用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;

        /// 将主机内存的图像数据上传到GPU内存

        src.upload(src_host);

        /// 调用GPU的阈值函数(很多使用GPU加速的函数都和CPU版本的函数相同)

        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安装路径来区分不同的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. https://www.jianshu.com/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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容