Ubuntu下OpenCV的安装与初步运用

一、安装OpenCV及依赖库

1、OpenCV是啥

在这里插入图片描述

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++类构成,同时提供Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。

2、下载资源

cmake安装

sudo apt-get install cmake

– 依赖环境

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

– 下载opencv
官网下载地址https://opencv.org/releases/
unbuntu内打开浏览器,打开网页,选择要下的版本,点击Sources在这里插入图片描述

然后就是心酸的下载过程在这里插入图片描述
在这里插入图片描述
失败了好多次,速度有时慢如龟爬,但是总算是下载成功了。

3、安装

– 解压文件
双击压缩包,选择解压位置,然后进入解压后的目录。如果要在终端用命令行解压也行

unzip opencv-3.4.x.zip
cd opencv-3.4.x

在这里插入图片描述
– 创建编译文件夹,并进行配置

mkdir my_build_dir
cd my_build_dir

– cmake

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

这一步等待时间并不长,大概五分钟

– 开始编译

sudo make -j8

我这里一开始是多线程编译,速度应该要提升不少,但是有失败的风险,我也是在35%的时候中断了

sudo make

老老实实make 吧,确实会比较漫长,建议先去吃个饭qAq
在这里插入图片描述
在这里插入图片描述
成功咯!

– 开始安装

sudo make install

这一步会很顺利,install完了,安装也就结束了。

4、环境配置

用gedit打开/etc/ld.so.conf,打开是一片空白,还有警告但是不用管。
在文件中加上一行 /usr/loacal/lib
其中/user/loacal是opencv安装路径也就是makefile中指定的安装路径

sudo gedit /etc/ld.so.conf

在这里插入图片描述
sudo ldconfig 一下,保存刚才的修改

sudo ldconfig  

同样的修改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

在这里插入图片描述

5、检验一下

查看版本

pkg-config opencv --modversion

在这里插入图片描述
好了,OpenCV安装成功

二、编写一个打开图片进行特效显示的程序

进入OpenCV文件夹,创建一个工作目录,再创建第一个OpenCV程序

cd opencv-3.4.11
mkdir mytest
vim 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("lena.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;
}

注意要把需要打开和处理的图片放在test.cpp同一个目录下在这里插入图片描述
编译程序
一开始我的编译命令是

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

然后是这样的错
在这里插入图片描述
其实就是要用g++进行编译,当g++编译到c代码部分,它会用gcc编译,也就是说g++是向下兼容的,所以正确的编译命令是

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

它是如何获得opencv头文件、链接lib库文件的路径的?

答曰:–cflags用来指定程序在编译时所需要头文件所在的目录;–libs是指定程序在链接时所需要的动态链接库的目录

编译成功

在这里插入图片描述
运行

./test

在这里插入图片描述
运行又出问题了⊙﹏⊙
看看问题描述,说是加载啥东西失败了,那就把那个东西安装下一呗

sudo apt-get install libcanberra-gtk-module

感觉大家在运行时可能不会遇到我这个问题,很迷惑,按照同样的步骤来执行,为啥还有这样那样的东西没搞好呢:-O
但是我成功了o
在这里插入图片描述
百度图片上找的,她也叫lena,但是我不知道是不是那个计算机视觉的那个经典lena,_

三、使用opencv库编写打开摄像头的程序

新建test1.cpp

vim 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);//延时30ms
	}

	system("pause");
	return 0;
}

在编译之前先检查一下你的Ubuntu虚拟机的摄像头打开没

虚拟机->可移动设备->“你的摄像头名称”->连接(断开与主机的连接)

然后在右下角看看摄像头的标志亮着没
在这里插入图片描述
准备就绪,编译,运行

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

在这里插入图片描述

有点尴尬的是,这个程序是需要改进的,因为代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉,你会一直看到你自己或者你后面同学的脸(笑)
当然这个很好改,在while循环里,增加一个对waitkey这个延时函数的if语句,让它可以在我们按Esc(ASCII码为27)后break就可以了。
改过后的代码如下

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	//从摄像头读取视频
	VideoCapture capture(0);
	//循环显示每一帧
	while (1)
	{
		Mat frame;//定义一个Mat变量,用于存储每一帧的图像
		capture >> frame;//读取当前帧
		imshow("读取视频帧", frame);//显示当前帧
		if(waitKey(30)==27) //按esc键退出,
		{
			break;
		}
	}
	system("pause");
	return 0;
}

第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?

答曰:Mat是一个类。由两部分数据组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。waitKey()–这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下 键,则接续等待(循环),不能删除,因为一般在imshow()后要使用waitKey(),给图像绘制留下时间,不然窗口会出现无响应情况,并且图像无法显示出来。

四、修改上一个程序打开硬盘上一个视频文件来播放

上一个代码很精简,但是也很够用了,只需要

把capture() 中的0换成视频文件的地址

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
        //从摄像头读取视频
        VideoCapture capture("/home/chenjinrui/下载/Earth.mp4");
        //循环显示每一帧
        while (1)
        {
                Mat frame;//定义一个Mat变量,用于存储每一帧的图像
                capture >> frame;//读取当前帧
                imshow("读取视频帧", frame);//显示当前帧
                waitKey(30);//延时30ms
        }

        system("pause");
        return 0;
}

编译运行

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

然后我整了个gif,花了好多时间O_o在这里插入图片描述

有个问题就是,不知道是不是我下的视频资源太高清了,打开直接出现一个超大的窗口,比桌面都大。

五、使用opencv库编写打开摄像头压缩视频的程序

创建test3.cpp

vim test3.cpp
 /*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频 video.mp4
*********************************************************************/
#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("video.mp4", 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;
}

编译运行

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

然后就给自己录了个视频
在这里插入图片描述
全部大功告成咯!

六、参考链接

ubuntu安装opencv的正确方法
Gtk-Message: Failed to load module “canberra-gtk-module”
OpenCV-Python学习之(一)waitKey()函数详解
pkg-config --cflags --libs

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