Ubuntu 18.04下OpenCV的安装与简单应用


本文主要叙述了OpenCV3.4.14安装及使用示例
操作系统:Ubuntu Desktop 18.04


一、简介

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉机器学习软件库,可以运行在LinuxWindowsAndroidMac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV用C++语言编写,它具有C ++,PythonJavaMATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。[1]

OpenCV的应用领域主要包括以下几个方面

  • 人机互动
  • 物体识别
  • 图像分割
  • 人脸识别
  • 动作识别
  • 运动跟踪
  • 机器人
  • 运动分析
  • 机器视觉
  • 结构分析
  • 汽车安全驾驶

二、安装

1.下载安装包

OpenCV的官网上面下载,或者在GitHub上面下载OpenCV,推荐在国内镜像网站上面下载OpenCV。下载地址如下

官网:https://opencv.org/

Github:https://github.com/opencv/opencv/releases

国内:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/

在这里我们选择下载opencv-3.4.14 zip。
在这里插入图片描述

2.解压安装包

下载后,我们可以将opencv 3.4.14.zip的安装包移动到home目录下,这样便于操作。如果是桌面版的Linux系统可以直接右键选择提取到此处
在这里插入图片描述

unzip opencv-3.4.14.zip

这时会在当前目录下生成包含解压后文件的文件夹。
在这里插入图片描述

3.安装opencv

首先进入解压后的文件下,在终端输入以下命令

cd opencv-3.4.14.zip

可以进入root模式,这样后面可以不用输入sudo命令,在终端输入下面的命令。

sudo su

然后检查是否安装了cmake,需要使用cmake来安装opencv,所以可以在终端输入cmake,如果提示没有找到此命令,则需要安装cmake。
在这里插入图片描述
和之前安装gcc一样,在终端输入下面的命令

sudo apt-get install cmake

在这里插入图片描述
如果提醒需要apt-get update,那就在终端输入下面的命令更新

sudo apt-get update

安装完cmake之后需要安装依赖包,在终端输入以下命令来安装依赖包

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev  

在安装依赖包时可能会出现下面的问题。
在这里插入图片描述
可以参考无法定位软件包libjasper-dev的解决办法,在终端输入下面的命令

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt upgrade
sudo apt install libjasper1 libjasper-dev

根据提示输入Y/y
在这里插入图片描述
安装完cmake之后执行命令,创建编译文件夹,进入build文件夹

mkdir build
cd build

使用cmake编译参数

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

使用make创建编译。仍然在build文件夹下进行,在终端输入

sudo make

在这里插入图片描述

PS:单线程编译需要很长时间,可以使用命令

sudo make -j4

以4个线程进行编译,可以节约很多时间。

编译好后执行如下命令安装OpenCV

sudo make install

4.配置环境

安装好opencv后,接下来就需要配置一些OpenCV的编译环境。首先将OpenCV的库添加到路劲,在调用OpenCV的库函数时系统可以找到库函数的位置,在终端输入下面的命令

sudo gedit /etc/ld.so.conf.d/opencv.conf

或者选择其他的文本编辑软件如nano、vi/vim等打开,编辑系统文件需要添加sudo选项。执行此命令后打开的文件可能是空白文件,在文件中添加以下内容

/usr/local/lib

点击保存,然后关闭文件。
在这里插入图片描述
更新系统共享链接库

sudo ldconfig

配置bash,修改bash.bashrc文件

sudo gedit /etc/bash.bashrc  

打开文件后,在最末尾添加下面的文字

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  

点击保存后关闭文本编辑器
在这里插入图片描述
然后执行下面的命令使配置生效和更新

source /etc/bash.bashrc
sudo updatedb

到此为止,所有的配置已经完成。

可以查看一下OpenCV的版本信息

pkg-config --modversion opencv

在这里插入图片描述

三、示例——图片

首先创建test.cpp并编辑它

gedit test.cpp

输入以下代码

#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("temp.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;
}

在这里插入图片描述
上面的代码里面我们用到了mat数据类型,在OpenCV的官网上面可以查询到相关资料

官网Mat解释:https://docs.opencv.org/3.4.14/d3/d63/classcv_1_1Mat.html
在这里插入图片描述
OpenCV的矩阵是用Mat这个对象来存储的,并且提供了一些函数操作矩阵的属性。关于Mat数据类型的更多知识,请在OpenCV官网或者在CSDN上搜索。
接下来编译文件,执行下面的命令(注意:后面的符号`是英文输入状态下键盘左上角的~)

gcc test.cpp -o test `pkg-config --cflags --libs opencv`

gcc编译器:gcc + 文件名 + -o + 输出文件流名称 +` 支持包

如果出现如下的错误
在这里插入图片描述
需要用C++编译器编译接口模块。解决方法是打开相关的so下的build.sh(每个产生so目录下,吾都写了个build.sh),把gcc改成g++。然后再重新编译。或者直接将输入的命令中的gcc改为g++

g++ test.cpp -o test `pkg-config --cflags --libs opencv`

在同文件夹下准备一张照片,命名为temp.jpg。
在这里插入图片描述
执行编译好的可执行文件test,可以看到生成了test.png
在这里插入图片描述

四、示例——视频

1. 准备工作

如果使用虚拟机来进行本实验,那么需要让虚拟机获取摄像头的权限。在Windows系统下,右键桌面上的此电脑,点击管理。
在这里插入图片描述
然后依次服务和应用程序->服务
在这里插入图片描述
或者在键盘上按下Win+R,输入services.msc,回车。检查VMware USB Arbitration Service服务项有没有开启。
在这里插入图片描述
在VMwareWorkstation软件下,点击虚拟机,然后选择设置。
在这里插入图片描述

如果没有USB控制器的选项,先点添加,然后选择USB控制器。
在这里插入图片描述
然后再点击“虚拟机”菜单,选择“可移动设备”,再选择自己的相机设备,最后点击“连接”,在弹出的窗口点击“确定”。
在这里插入图片描述

2.播放视频

创建一个test1.cpp文件,代码如下

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
 
int main(int argc, char* argv[])
{
	VideoCapture capture;
	//capture.open(0);   //打开摄像头  
	capture.open("temp.mp4");   //打开视频  
	if (!capture.isOpened())
	{
		cout << "video not open." << endl;
		return 1;
	}
	double rate = capture.get(CV_CAP_PROP_FPS);     	//获取当前视频帧率
	//当前视频帧
	Mat frame;
	//每一帧之间的延时
	int delay = 1000/ rate;      	//与视频的帧率相对应
	while (1)
	{
		if (!capture.read(frame))   //获取视频或摄像头的每一帧
		{
			cout << "no video frame" << endl;
			break;
		}
		imshow("video", frame);
		//引入延时
		//也可通过按键停止
				int k = waitKey(30);
		// 实现按键暂停和退出视频播放功能		
		if (k == 27)
			break;
		else if (k == 32)
		{
			while (waitKey(0) != 32)
				waitKey(0);
		}
	}
	//关闭视频,手动调用析构函数(非必须)
	capture.release();
	return 0;
}

编译test1.cpp文件,在终端输入下面的命令

g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`

注意:在同目录下需要有视频文件,对应上面的代码,视频的名字是:temp.mp4
在这里插入图片描述

打开的效果如上,在键盘上按下ESC退出,按下空格暂停/继续。

3. 录制视频

创建一个test2.cpp程序,代码如下

#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

int main()
{
	//打开电脑摄像头
	VideoCapture cap(0);
	if (!cap.isOpened())
	{
		cout << "error" << endl;
		waitKey(0);
		return 0;
	}

	//获得cap的分辨率
	int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
	int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	Size videoSize(w, h);
	VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
	
	Mat frame;
	int key;//记录键盘按键
	char startOrStop = 1;//0  开始录制视频; 1 结束录制视频
	char flag = 0;//正在录制标志 0-不在录制; 1-正在录制

	while (1)
	{
		cap >> frame;
		key = waitKey(100);
		if (key == 32)//按下空格开始录制、暂停录制   可以来回切换
		{
			startOrStop = 1 - startOrStop;
			if (startOrStop == 0)
			{
				flag = 1;
			}
		}
		if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
		{
			break;
		}

		if (startOrStop == 0 && flag==1)
		{
			writer << frame;
			cout << "recording" << endl;
		}
		else if (startOrStop == 1)
		{
			flag = 0;
			cout << "end recording" << endl;
			
		}
		imshow("picture", frame);
	}
	cap.release();
	writer.release();
	destroyAllWindows();
	return 0;
}

编译test2.cpp文件,在终端输入下面的命令

g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`

在这里插入图片描述
在按键上按下空格键暂停录制/开始录制,按下ESC键退出录制,录制好的视频会保存在同一目录下。
在这里插入图片描述

五、总结

在Ubuntu系统下安装OpenCV至此就结束了,有些问题还需要读者自寻寻找答案。OpenCV可以在应用在很多领域,如人脸识别等。而且OpenCV支持多种语言,可以在Windows系统下开发视频软件。


版权声明:本文为qq_41675500原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。