基于Ubuntu的opencv3.4.1安装与使用
- 1.opencv的安装
- 1.1 准备工作
- 1.2 解压并安装
- 1.3 依赖库和cmake的安装
- 1.4 opencv的编译
- 1.5 配置opencv库以及配置bash
- 2.opencv的使用——图片特效
- 2.1 创建test.cpp文件
- 2.2 编译文件
- 2.3 运行结果
- 3.opencv的使用——显示视频
- 3.1 创建test1.cpp文件
- 3.2 编译文件
- 3.3 运行结果
- 4.总结
1.opencv的安装
1.1 准备工作
首先我们要先准备opencv3.4.1压缩包,可以在windows下下载,然后借助vm tools复制粘贴到Ubuntu里面这样大大减少了下载的时间。
这里提供opencv3.4.1压缩包:点击下载 下载好之后并且放到Ubuntu里面自己喜欢的文件夹里面。
1.2 解压并安装
进入自己喜欢的文件夹,进行解压操作。
输入命令:
unzip opencv-3.4.1.zip
即可完成解压。
然后,我们需要进入文件夹opencv-3.4.1中
输入命令:
cd opencv-3.4.1
即可。
1.3 依赖库和cmake的安装
在依赖库和cmake的安装之前,我们先进入管理员权限以此获得更多的权限。(此部分需要网络通畅,如果因为网络原因失败可以多尝试几次)
输入命令:
sudo -s
并且输入密码进入管理员权限
接下来我们进行cmake的安装
输入命令:
sudo apt-get install cmake
即可安装cmake。(cmake是一个跨平台的安装(编译)工具,之后我们需要它来进行编译)
结果如下即为安装成功
依赖库的安装
输入命令:
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
在这里我们遇到了一个错误
解决办法如下:
分别依次输入命令:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
可能是libjasper-dev缺少它的依赖包libjasper1(解决方法参考博客)
之后再重复安装命令安装即可
结果如下:
解决问题
安装成功
1.4 opencv的编译
下载好cmake和依赖库之后,我们需要开始编译
先创建一个编译文件夹并且进入文件夹内。
依次输入命令:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
通过漫长的编译过程
结果如下:
从0%到100%
1.5 配置opencv库以及配置bash
安装成功后我们需要一些简单的配置,让系统可以找到
输入命令:
sudo gedit /etc/ld.so.conf.d/opencv.conf
会打开一个文件,在文件末尾添加 /usr/local/lib
点击保存之后关闭
再输入命令:
sudo ldconfig
opencv库配置完成
接下来需要配置bash
输入命令:
sudo gedit /etc/bash.bashrc
同样,在文件末尾添加PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
点击保存之后关闭
再输入命令:
source /etc/bash.bashrc
bash配置完成
最后再进行一次更新即可
输入命令:
sudo updatedb
所有的配置完成,接下来使用opencv。
2.opencv的使用——图片特效
2.1 创建test.cpp文件
在文件夹opencv-3.4.1下创建并进入mytest文件夹,在mytest文件夹下创建一个test.cpp文件并写入代码
输入命令:
mkdir mytest
即可创建mytest文件夹
输入命令:
cd mytest
touch test.cpp
即可进入文件夹并创建文件test.cpp
vim test.cpp
即可打开test.cpp文件编辑
按I开始在光标处插入
输入代码:
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("test1.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}
}
按ESC回到命令模式
输入:wq
退出vim编辑器并保存
2.2 编译文件
输入命令:
g++ test.cpp -o test `pkg-config --cflags --libs opencv`
即可成功编译
编译语句中-o前后就是将待编译文件名和输出文件名
而``中包括的就是支持包
pkg-config:其中pkg-config给出了opencv的头文件和库的所有信息
我们在安装opencv的时候就会给/usr/lib/目录下,放一个opencv.pc
我们刚在配置opencv库的时候就放到/usr/local/lib(其中/usr/lib是系统级的,/usr/local/lib是用户级的)这也是为了在使用opencv的时候让系统知道在哪里
而我们刚才在配置bash的时候用PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件,这就是为什么pkg-config有opencv的头文件和库的所有信息。
cflags: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。
所有用opencv的其他程序,在编译时,只需要写pkg-config --cflags --libs opencv
,而不需要自己去找opencv的头文件在哪里,要链接的库在哪里。
2.3 运行结果
在运行之前我们需要给文件夹里放一张名为test1.jpg的图片
在运行时程序需要调用
输入命令:
./test
即可成功运行
在这里我们遇到了一个问题
输入命令:
sudo apt-get install libcanberra-gtk-module
即可解决,问题解决参考博客 之后再重复运行命令即可
成功运行结果
3.opencv的使用——显示视频
3.1 创建test1.cpp文件
与上面相同创建一个test1.cpp文件,源码如下:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0); //从摄像头读取视频
while (1) //循环显示每一帧
{
Mat frame; //定义一个Mat变量,用于存储每一的图像
capture>>frame; //读取当前帧
imshow("读取视频帧", frame); //显示当前顿
waitKey(30); //延时30m
}
system("pause");
return 0;
}
代码分析
(代码替换完成后记得编译一下再执行)
①这个程序无法关闭,除非强制结束,我们可以定义一个按键**key**
在主函数中加入定义
int key;
再在循环中加入
key = waitKey(10);
if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
{
break;
}
即可按ESC退出程序
②Mat是一个类。由两部分数据组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。
③waitKey()–这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下 键,则接续等待(循环),如果,不加这个函数的话,我们可能看不到画面,画面瞬间过去。
④如果要打开一个视频文件的话需要替换代码
//原代码
VideoCapture capture(0); //从摄像头读取视频
//替换如下
VideoCapture capture("test3.avi"); // 从视频文件读取
需要在之前给同目录下放一个名为==test3.avi==的视频文件即可
下面提供直接复制:
int key;
key = waitKey(10);
if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
{
break;
}
原代码
VideoCapture capture(0); //从摄像头读取视频
替换如下
VideoCapture capture("test3.avi"); // 从视频文件读取
3.2 编译文件
编译和上面相同
输入命令:
g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`
上面已经解释过各个支持包,这里不再赘述。
3.3 运行结果
打开摄像头
打开视频文件
4.总结
通过以上对opencv的系列操作,我们使用opencv来给照片加特效,读取本地视频文件,以及打开摄像头显示视频帧等操作,了解到了opencv的强大之处。当然如果你感兴趣的话可以再去探索一些,实现更多的操作。