基于Ubuntu的opencv3.4.1安装与使用

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的头文件在哪里,要链接的库在哪里。
此处参考博客:
pkg-config详解
CFLAGS详解
/lib /usr/lib /usr/local/lib区别

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的强大之处。当然如果你感兴趣的话可以再去探索一些,实现更多的操作。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页