Ubuntu 16.04安装opencv

前言

今天花了一天的时间在ubuntu上安装opencv(不是python包中的opencv-python,是c++接口的opencv),所谓万事开头难,难倒我的第一步不是知识,而是配环境,说到底就是菜。

在这里插入图片描述

mark一下,避免下次换电脑重新配环境的时候又捣鼓半天。

cmake

执行cmake命令之前的一些步骤就不写了,网上有很多,比如从官网或者github上下载源码,比如安装相关的依赖库(如果安装不上,那就想想办法装上吧),比如进入源码目录,然后mkdir build,cd build/

网上有各种cmake带不同的参数的命令,比如:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/home/fanzong/anaconda2/envs/tensorflow \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.2.0/modules \
    -D PYTHON_EXCUTABLE=/home/fanzong/anaconda2/envs/tensorflow/bin/python \
    -D WITH_TBB=ON \
    -D WITH_V4L=ON \
    -D WITH_QT=ON \    # 1
    -D WITH_GTK=ON \
    -D WITH_OPENGL=ON \
    -D BUILD_EXAMPLES=ON ..

直接copy上面的部分肯定不行,其中的CMAKE_INSTALL_PREFIXOPENCV_EXTRA_MODULES_PATH肯定要修改,原博主用的是自己的目录,也不提醒一下,对我们这种不认真看参数的菜鸟着实不友好(说到底还是自己菜),以及WITH_QT,如果没安装QT的话也是要改的。

翻了很多博客,最终选择了一种于我而言可行的cmake命令:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

其中/usr/local是默认目录,可以不用修改(修改了也不知道行不行),注意最后面还有2个点,表示源文件目录,也就是build的上一级目录,不能少!上面的命令只设置了两个参数,其余的参数都是默认的。

其实之前的时候使用刚刚这条命令也会报错,试了很多次还是报错,可能是安装包版本太高,之前是3.4.6,后来改成了3.4.0,就ok了。

make

cmake成功之后,执行make -j4,4应该是表示4个内核,执行之后发现CPU迅速up to 99%,然后是sudo make install,静静地等一会儿,一般cmake成功之后,make就错不了了。

g++

先不管在VScode中配置c++,直接在终端编译一下g++ t1.cpp -o t1,可能会遇到如下错误:

/tmp/ccYN8HAH.o:在函数‘main’中:
t1.cpp:(.text+0x46):对‘cv::imread(cv::String const&, int)’未定义的引用
t1.cpp:(.text+0x98):对‘cv::imshow(cv::String const&, cv::_InputArray const&)’未定义的引用
t1.cpp:(.text+0xc0):对‘cv::waitKey(int)’未定义的引用
/tmp/ccYN8HAH.o:在函数‘cv::String::String(char const*)’中:
t1.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x54):对‘cv::String::allocate(unsigned long)’未定义的引用
/tmp/ccYN8HAH.o:在函数‘cv::String::~String()’中:
t1.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14):对‘cv::String::deallocate()’未定义的引用
/tmp/ccYN8HAH.o:在函数‘cv::String::operator=(cv::String const&)’中:
t1.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28):对‘cv::String::deallocate()’未定义的引用
/tmp/ccYN8HAH.o:在函数‘cv::Mat::~Mat()’中:
t1.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39):对‘cv::fastFree(void*)’未定义的引用
/tmp/ccYN8HAH.o:在函数‘cv::Mat::release()’中:
t1.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b):对‘cv::Mat::deallocate()’未定义的引用
collect2: error: ld returned 1 exit status

源代码是这样的:

#include<opencv2/opencv.hpp>
using namespace cv;
int main(){
    Mat srcImg=imread("1.jpeg");
    imshow("hello",srcImg);
    waitKey(0);
    return 0;
}

查了一下原因,可能是之前cmake的时候没有修改CMakeLists.txt的部分内容,具体原因暂时不清楚;但是修改后重新cmake一遍比较费时间(主要是电脑菜),所以选择了另一种方式:
g++ t1.cpp -o t1 `pkg-config --libs --cflags opencv`
注意,`是键盘上数字1左边那个键的英文符号;
出现上述错误主要是编译时找不到静态链接库,所以要在命令中添加上依赖,如果没有pkg-config命令,那就先解决这个问题,比如安装一下pkg-config

然后就编译成功了,运行./t1之后就可以看到黑洞了:
在这里插入图片描述
只需要敲一条命令就可以看到黑洞,比那些用望远镜才能看到黑洞的不知道高级到哪里去了(手动滑稽。。。)

当然,最后还得配置一下VScode中的c++,修改一下launch.json中的参数应该就行了,easy.

后续-安装opencv_contrib

时隔三天,发现之前没有安装对应的contrib组件(包含人脸识别、立体匹配等技术,具体可参考https://docs.opencv.org/3.4.0/files.html下的opencv_contrib目录),于是打算重新安装一下contrib组件,要不然没法调用一些功能。

安装步骤

不用删掉之前安装在/usr/local/下的文件,如果之前下载的源文件还在的话,下载对应的contrib源文件到之前的opencv目录下。进入build目录(没有的话就创建一个),开始cmake

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_OPENMP=OFF -D BUILD_opencv_xfeatures2d=OFF -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.0/modules ..

相比于之前,多了个参数OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.0/modules,版本号请根据实际情况进行修改。

请注意,上面的命令还有个参数-D BUILD_opencv_xfeatures2d=OFF,这是因为之前我编译完进行make的时候,总是会报错:opencv2/xfeatures2d/cuda.hpp:No such file or directory;但是在contrib源文件的opencv_contrib-3.4.0/modules/xfeatures2d/include/opencv2/xfeatures2d/下确实存在cuda.hppnonfree.hpp,真正原因在于我没有安装CUDA,所以无法编译需要cuda支持的部分文件,所以加了参数-D BUILD_opencv_xfeatures2d=OFF

(搜遍全网才在github上找到了唯一的上述解决方法,https://github.com/opencv/opencv_contrib/issues/1131

接下来就和之前的命令一样了:

make -j4
sudo make install

OK,大功告成。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值