RoboMaster视觉教程OpenCV(一)环境安装及代码测试
本系列是三丰在做RoboMaster比赛视觉组学习过程中的总结。
决定开始从OpenCV写起,因为大家的代码其实写的大部分是利用C++调用OpenCV库来进行图像处理。而这一系列笔记都是基于Linux系统,为什么不用windows?因为Linux配置环境真的太方便了,安装一个eigen库只需要一行指令,而Windows却要配好久的环境。因此在这里我也建议大家,不管是在学习过程中,还是实际编写代码的过程中,都用Linux系统就好。在windows上即便配置好环境,也没有什么大的作用。因为你最终还是要把这些代码移植到Linux的硬件平台上。
一 为什么要编译OpenCV二 Linux双系统三 安装中文输入法(可选,怎么方便怎么来)四 编译OpenCV和ffmpeg五 构建步骤5.1 换源5.2 安装必要的依赖5.3 构建ffmpeg5.4 构建OpenCV六 运行代码测试
一 为什么要编译OpenCV
因为根据源码构建OpenCV的能力是我们必须要掌握的,除了笔记本上自己安装的Ubuntu系统没有OpenCV之外,我们也有可能在自己的硬件平台上编译。拿manifold来说,系统其实自带OpenCV(使用dpkg -l命令可以看到所有已经安装了的库),那么为什么还要自己编译呢?因为manifold虽然安装了CUDA库(利用GPU进行图像处理)。但自带的OpenCVcv却没有添加CUDA功能(如果以后有人要写CUDA版本的RM程序,记得大幅修改,因为CUDAOpenCV cv里的类是单独的,另一个名字)。因此,我们需要自己编OpenCV ,DIY能够满足我们要求的OpenCV库。
二 Linux双系统
大家在比赛中所用的硬件平台有manifold、NUC等等,这些东西是学校的物品,而且每一个都特别贵,当然不可能人人都有。但为了学习呢,我们可以在笔记本上安装Linux双系统。
这个链接炒鸡详细:详细Linux双系统安装教程有不懂的地方,比如(分配空间,在网上多搜索几个文章,对照看就可以)
请一定要设置系统语言是英文,也就是说命令行桌面叫Desktop,而不是桌面。否则运行代码会有很多bug!!!!!!
三 安装中文输入法(可选,怎么方便怎么来)
个人认为在浏览器搜索,写中文注释等的时候,中文输入法还是很有必要的。
四 编译OpenCV和ffmpeg
这次我们安装三个库,ffmpeg4.2.2、OpenCV3.4.8和OpenCV-contrib3.4.8。
ffmpeg,对视频进行编码解码,不装这个库,OpenCV打不开很多视频文件格式,大家自己可以去ffmpeg官网下载最新版本的ffmpeg。下载选项也有很多(如已经构建好的Static版本,需要自己编译的源代码),大家记得下载源码(Source Code)。
OpenCV分为两个库,一个是OpenCV,放了OpenCV稳定的功能,另一个是OpenCV-contrib,将一些不太稳定的功能放进去了,contrib介绍。比如Tracking()函数,我们以后也会遇到,所以这里干脆一次性安装全乎了。 OpenCV github下载链接 OpenCV-contrib下载地址
这俩链接下载速度贼慢,不过已经比官网快许多了。这一节用到的所有资源大家也可以在公众号后台回复 day1获取。
我在这里下载了OpenCV 3.4.8(3.4.1是企业版应用最稳定的,不过这种稳定我们不一定用得到。所以大家自己选择喜欢的版本即可,步骤大同小异)
另外还要唠叨几句,所有在命令行的指令都可以写成一个sh格式的脚本,这样大家只需要一个指令便可以完成所有的安装步骤。但是一旦在使用其他版本安装包的时候便需要修改内容,不具有普适性。因此整个过程大家还是应该要掌握。此外OpenCV cv库的安装使用的是cmake。使用cmake-gui这个图形化的工具更加方便。
五 构建步骤
5.1 换源
- 修改sourses.list 这一步的操作本质是更改sourses.list这个文件里面下载软件包的网址
1. cd /etc/apt
sudo gedit sources.list
//这个地方要在文件里修改网址
sudo apt clean
sudo apt update
sudo apt upgrade
- 在输入sudo gedit sources.list后,会打开这个sources.list文件,把cn.archive.ubuntu(其他人的电脑可能是id.archive.ubuntu或者是ports.ubuntu)换成mirrors.aliyun
例如:deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
不要直接粘贴复制。因为有的是http,有的是https,不要随意更改。保证// 与第一个/之间是http://mirrors.aliyun.com即可
正常情况下,上面的指令可以很方便地执行,但是也有可能出错。出的错有太多种可能。大家如果有错直接百度,以后会写一个关于换源的总结。
5.2 安装必要的依赖
直接在命令行输入以下命令
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev -y
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev -y
sudo apt-get install cmake-gui
解析:
build-essential
作用是提供编译程序必须软件包的列表信息,没有可能在运行程序时出错,以防万一安装上,很多软件安装都需要这一步
cmake
构建代码常用的工具,用命令行构建。也可以从cmake官网下载最新版本
cmake-gui
构建代码常用的工具,用图形界面构建。
git
版本控制的东西。可以从版本库直接下OpenCV cv代码libgtk2.0-dev
调试界面,(我们以后会用qt做界面,不用这个,但这里安装上)pkg-config
用于获得某一个库/模块的所有编译相关的信息,链接库用的。我们后面用gcc编译时用到它,用qt包含OpenCV库时也用到它。很重要。
libavcodec-dev libavformat-dev libswscale-dev
ffmpeg需要的库
python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
这里安装了一些Python之类的库
sudo apt-get install 库 -y -y在这里的意思是遇到yes和no的选择,直接yes,就不需要再次输入了
5.3 构建ffmpeg
- 去这个网站下载yasm1.3.0
将ffmpeg-4.2.2.tar.bz2和yasm-1.3.0.tar.gz压缩包放到Downloads文件夹里 - 那么,以下命令是在这个Downloads文件夹里的命令(以下命令已经写到脚本ffmpeg.sh中,如果不想输入以下命令,在Downloads文件夹下直接输入命令:sudo ./ffmpeg.sh 一个脚本便可以运行下面所有命令)
tar -xjvf ffmpeg-4.2.2.tar.bz2
tar -xvzf yasm-1.3.0.tar.gz
ls
cd yasm-1.3.0/
./configure
make -j8
make install
cd ../ffmpeg-4.2.2
./configure --disable-cuda-nvcc --disable-opengl --enable-shared --enable-nonfree
make -j8
sudo make install
所有库安装的过程中,编译也就是make是最耗费时间的。所以需要多线程编译。make -j8 j后面的数即为多少线程一起编译,这个数应该是多少呢?是CPU核的两倍,如果电脑四个CPU核就是8。比如某个人电脑配置Intel® Core™ i5-6300HQ CPU @ 2.30GHz × 4
2.30GHz X 4,代表4个核
所以make -j8是恰当的
- 配置ffmpeg环境变量(这一步可以等OpenCV构建完毕后,再执行)
sudo gedit /etc/ld.so.conf
//在文件最后一行添加上: include /usr/local/lib
//保存退出
sudo ldconfig
sudo gedit /etc/bash.bashrc
//在文件最后添加两行:
//倒数第二行 PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
//倒数第一行 export PKG_CONFIG_PATH
source /etc/bash.bashrc
环境变量配置参考- 最后,不区分目录,直接在命令行里打出ffmpeg,应该出现以下信息
ffmpeg安装参考教程,报错点击它
5.4 构建OpenCV
将3.4.8contrib和之前的3.4.8文件夹放到Download
在OpenCV-3.4.8目录下:
mkdir build
cd build
cmake-gui
- 然后会弹出CMake的图形化界面,第一个路径选择Downloads/OpenCV-3.4.8,第二个路径选择刚才建的build文件夹 Downloads/OpenCV-3.4.8/build
- 点击左下方的Configure按钮,选择Unix Makefiles,选择Use default native compilers(默认),然后点击Finish
等待。配置的过程中,由于有墙,类似ippicv之类的库,可能无法下载以至于报错。可以选择删除build文件夹重新试一下。或者去github下载相关源码(ippic)进行配置,耐心等待,应该不至于无法下载。 - 出现红框后,需要进行选择。
在OpenCV_EXTRA_MODULES_PATH处,选择输入目录(单击这一行后方空白处即可选中), 然后选择OpenCV_contrib-3.4.8文件夹中的modules文件夹。 - 选中“BUILD_OpenCV_world”选项旁边的复选框。
- 再次点击configure
- 点击generate,cake-gui的使命结束了
- 在build文件夹下
sudo make -j8
sudo make install
- 配置环境变量(ffmpeg如果做过,我们已经将usr/local/lib添加到了ld.so.conf这个管理.so库路径的文件中,所以现在只需要更新一下: sudo ldconfig source /etc/bash.bashrc)
以上步骤完成后,我们就可以再次快乐的使用一个模块更加丰富OpenCV cv了。
cmake-gui安OpenCV cv参考阅读:
六 运行代码测试
建新文件夹,我命名为OpenCV-Test
进入文件夹后右键打开终端
touch main.cpp 创建名为main.cpp的文件
右键main.cpp,使用IDE打开
复制代码:
#include <OpenCV2/OpenCV.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
//读取照片
Mat image = imread("OpenCV_Logo.png");
//检测失误
if (image.empty())
{
cout << "Could notOpenCV or find the image" << endl;
cin.get(); //等待键盘输入
return -1;
}
String windowName = "OpenCV Test"; //窗口名称
namedWindow(windowName); //创建新窗口
imshow(windowName, image); //使用新窗口显示照片
waitKey(0); //等待键盘输入
destroyWindow(windowName); //关闭所有窗口
return 0;
}
OpenCV_Logo.png图片,放入与main.cpp相同的文件夹中。(OpenCV_Logo.png图片 在day1网盘中有。)
终端命令行执行:
g++ -o main main.cpp `pkg-config --libs --cflags OpenCV`
./main
出现一张图片,说明运行成功。(注意, pkg-config --libs --cflags OpenCV
旁边不是单引号,而是键盘数字1旁边的点)