ubuntu下opencv安装与使用

前言

首先,opencv安装和使用的教程可以说是很多了,但是作者在这个过程中还是踩下了很多坑,在这里会一一记录下来。所以很多执行的内容都会直接使用别人的教程不会去重复造轮子,这篇教程的核心是针对其中各种奇奇怪怪的问题。

其次,这里还要说一下源码安装和之前另一篇教程里面提到的安装opencv-python的问题。opencv-python是opencv的python接口的包,安装了之后可以直接在python中调用opencv的包,但是如果你要写一个c++文件,调用了opencv,那么安装opencv-python是没用的,必须要在编译安装opencv源码

最后本教程的操作系统是ubuntu18.04,不过其他基于Linux的操作系统。比如树莓派或者其他版本的ubuntu应该也都能适用,后面看情况也许会更新Windows系统下的

安装

准备

快速安装

问题分析

  • opencv和opencv_contrib版本要一致,而且在cmake的时候版本号也要改成自己的
  • opencv_contrib一定要放到opencv文件夹里面去,很多教程都是基于这个的基础来配置后面的cmake条件的,但是说明了的却很少,如果不这么做,cmake的时候虽然看起来没有报错,但是却不会产生makefile文件
  • 总的来说刚刚的那篇安装教程还是写的很不错的,这些都说到了
  • 安装完成后,不要立即把文件夹删除,或者说如果不是空间有限的话最好还是留着,里面有很多的例程和测试代码后面会用到,就算要删除这些也不要删

测试

可以不用按照教程的那个代码测试,而且如果你直接按照那个测试编译的话,很有可能那就陷入另一个问题之中,而后怀疑自己是不是安装错误了,这个问题会在后面再说到,这里先说一下测试

之前说过下载下来的源码文件夹中是有很多测试文件的。可以利用那里的文件测试

1
2
3
进入samples/cpp/example_cmake
make
./opencv_example

出现写有hello opencv的图像即可

使用

问题介绍

如果直接安装教程的那个使用g++去编译代码会发生什么事情呢?

  • 未定义引用
  • 或者undefined reference的问题
  • 其实都是一个问题不过是语言不一样
  • 具体如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    example.cpp:(.text+0x6c):对‘cv::VideoCapture::VideoCapture()’未定义的引用
    example.cpp:(.text+0x80):对‘cv::VideoCapture::open(int)’未定义的引用
    example.cpp:(.text+0x8f):对‘cv::VideoCapture::isOpened() const’未定义的引用
    example.cpp:(.text+0xc6):对‘cv::VideoCapture::operator>>(cv::Mat&)’未定义的引用
    example.cpp:(.text+0x14d):对‘cv::imshow(cv::String const&, cv::_InputArray const&)’未定义的引用
    example.cpp:(.text+0x175):对‘cv::waitKey(int)’未定义的引用
    example.cpp:(.text+0x1cd):对‘cv::Mat::zeros(int, int, int)’未定义的引用
    example.cpp:(.text+0x24c):对‘cv::imshow(cv::String const&, cv::_InputArray const&)’未定义的引用
    example.cpp:(.text+0x274):对‘cv::waitKey(int)’未定义的引用
    example.cpp:(.text+0x28e):对‘cv::VideoCapture::~VideoCapture()’未定义的引用
    example.cpp:(.text+0x32d):对‘cv::VideoCapture::~VideoCapture()’未定义的引用

分析

首先,这是因为找不到第三方动态链接库的问题。

其次,你不要想着通过添加环境变量,或者说制定动态链接库所在的文件夹来解决问题,因为其实这些文件夹本身就已经在环境变量中了

然后,也别想着通过把相关链接库复制到当前文件夹下来解决问 题,因为既然之前动态链接库所在文件夹已经在环境变量中了但是没有用,这样当然也不会用

那么怎么办呢?我们可以回去看看之前在测试的时候make的时候发生了什么事情

1
g++ example.o -o opencv_example -L/usr/local/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core -ldl -lm -lpthread -lrt

也就是说这是需要我们自己在编译过程中制定第三方链接库,而不是仅仅说库所在的文件夹在环境变量中就可以了。

但是这个第三方库这么多。难道要一个个添加,或者要去学着写makefile吗?

具体可以看看这篇教程对于这个问题介绍和解决

所以最终最方便的解决办法就是加上:$(pkg-config –libs opencv –cflags)

1
g++ example.cpp $(pkg-config --libs opencv --cflags)

opencv 介绍

内容

主要是介绍一下最终安装完成后的整个一个opencv的目录下不同文件夹的内容

参考链接:
opencv目录解构