Ubuntu下安装OpenCV4.6.0并使用

什么是OpenCV

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux,Windows,Mac等操作系统上。

它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

在系统中安装了Opencv库后,我们就可以通过引入头文件的方式使用OpenCv中的各种算法,用于计算机视觉以及图像处理。

安装OpenCV

安装OpenCV的过程很复杂,可能会多次失败。建议有耐心多试几次。

  • 系统:Linux(Ubuntu18.04.1)
  • 软件:OpenCv
  • 下载版本:4.6.0

1.下载安装包

下载地址:https://github.com/opencv/opencv/releases

在这里插入图片描述

github网站访问有时候很卡,有能力的可以使用魔法上网。

2.解压缩

下载好后,可以在文件夹中看见被下载好的压缩包文件(我的是在当前用户目录下)

在终端打开该路径,使用指令解压:

unzip opencv_4.x.zip

解压缩后可以看见文件夹。

在这里插入图片描述

3.下载CMake并完成配置

sudo apt-get cmake

下载完成后,在进入之前解压的文件夹,创建并进入一个build文件夹。

cd opencv_4.x
mkdir build
cd build

使用以下指令配置cmake:

cmake -DCMAKE_BUILD_TYPE=Release \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local ..

这里我参考了博客:https://blog.csdn.net/spiremoon/article/details/105812303

之前我照着老师给的参考博客进行下载,在完成所有安装操作后,输入打印OpenCv版本的指令时会提示以下报错:

Package opencv4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv4.pc’
to the PKG_CONFIG_PATH environment variable

原因是在完成安装后,OpenCv没有生成Opencv4.pc文件。在OpenCv4以前的版本是会自动生成该文件的。到了4版本,OpenCv默认不会自动生成.pc文件。因此在配置cmake时一定要带上如下参数:

-DOPENCV_GENERATE_PKGCONFIG=ON

表示开启生成配置文件的功能。

4.下载依赖

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

在这一步可能会出现问题,出现报错:“Unable to locate package libjasper-dev”

我最开始以为是Ubuntu镜像源的问题,于是我参考了以下博客,更换了Ubuntu的镜像源。

原博客:https://blog.csdn.net/laoluobo76/article/details/108302191

使用以下指令,将下载源替换成清华大学镜像:

sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list

但是替换镜像源后依旧会继续报错。因此我又再网上搜索了很久,找到了这篇博客:

https://blog.csdn.net/qq_44830040/article/details/105961295

按照这篇博客的说法,我执行了以下指令:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"

sudo apt update

于是libjasper-dev也成功下载了。

5.编译并安装

在build下,使用以下指令进行编译:

sudo make

输入指令后,会看到程序从0%开始进行编译。现在要做的是等待编译完成。这个过程非常长。想要加快速度,可以这样打:

sudo make -4j

这是使用4个线程进行编译,可以一定程度上加快编译速度。

但是笔者在使用该指令的时候出现了问题。在编译途中提示部分指令执行失败,然后整个虚拟机进入卡死状态,并在几分钟后恢复正常并提示编译失败。笔者重复试验了好几次都是这样。因此如果你使用多线程编译出现跟我一样的情况时,请老老实实使用原始指令编译。

在编译完成后,使用指令:

sudo make install

完成安装。

6.OpenCV环境配置

环境配置的过程参照了此博客:https://blog.csdn.net/ssj925319/article/details/109231145

原博客的OpenCV是3版本的,但是在配置环境这一点两个版本之间几乎没有什么区别。

修改 opencv.conf 文件,添加 opencv 库的安装路径:/usr/local/lib。这个路径是配置cmake的时候配置的。

执行以下指令:

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

填入/usr/local/lib并保存退出。

更新系统共享链接库:

sudo ldconfig

配置 bash ,修改 bash.bashrc 文件,在文件末尾加上这一段:

![opencv4_v_name](E:\学习资料\嵌入式作业\02_函数库与opencv\02_02_opencv\opencv4_v_name.png)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

最后查看OpenCV4版本号,如果能够查看成功,说明OpenCV安装并配置成功。

输入以下指令:

pkg-config --modversion opencv4

在这里插入图片描述

注意,这里与原博客不一样,这里OpenCV4生成的cp文件名是“opencv4”,而不是旧版本的“opencv”。因此注意不要打错。如果打成opencv,那么会报Package opencv was not found in the pkg-config search path。如果在cmake配置时没有开启生成pc功能,那么就会报上文所提及的错误。

在这里插入图片描述

之所以会报Package xxx was not found in the pkg-config search path,是因为在pkg-config search path下没有找到你输入的包名xxx。要么你输错名字(opencv与opencv4),要么没生成pc文件。

下面几张图,我通过修改cp文件名字,模拟需要的cp文件不存在,验证报错原因。

在这里插入图片描述

在这里插入图片描述

代码示例

图片处理

创建好项目路径,在路径下创建一个cpp文件。

vim test.cpp

这里有一段代码,用于将图像灰化。在test.cpp中粘贴下面这段代码:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

Mat src, gray;

int main()
{
        src = imread("mopemope.jpeg");//这里是你的图片

        if (src.empty())
        {
                cout << "没有读取到图像" << endl;
                return -1;
        }
                gray.create(row, col, CV_8UC1);

        for (int i = 0; i < row; i++)
        {
                for (int j = 0; j < col; j++)
                {
                        gray.at<uchar>(i,j)= src.at<Vec3b>(i, j)[0] * 0.144 		 +src.at<Vec3b>(i, j)[1] * 0.587 + src.at<Vec3b>(i, j)[2] * 0.299;
                }
        }

        imwrite("test.jpg", gray);//这里是你的输出

        waitKey(0);
        
        return 0;
}

根据你写的文件路径,在对应的位置准备相应的图片文件(我这里是当前路径下,一张名为mopemope的jpeg文件)

在这里插入图片描述

然后输入以下指令:

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

就可以看见生成了可执行文件。

在这里插入图片描述

注意,笔者在编译成功之前也有尝试按照https://blog.csdn.net/ssj925319/article/details/109231145中的指令进行编译,即在g++ .cpp -o .out指令后面加上pkg-config --cflags opencv4

g++ test.cpp -o test.out `pkg-config --libs opencv4` 

但是不知道为什么会报错,如下图所示:

在这里插入图片描述

笔者还暂未找到原因,希望有大佬能够指点迷津!如果你也是和我一样的小白的话,建议用最开始我成功的那条指令编译。

现在执行以下可执行文件,看见已经生成了新的图片,效果是根据彩色图片生成灰度图片。

在这里插入图片描述

先生买朵小花吧()

视频处理

虚拟机获取摄像头权限

参照https://blog.csdn.net/ssj925319/article/details/109231145

使用快捷键 Win + R ,输入 services.msc ,并回车。

找到程序VMware Authorization Service,确保已经启动。

在这里插入图片描述

进入VMware应用,找到虚拟机设置选项,虚拟机->设置->硬件->usb兼容性调usb3.0以上;选择 “ 虚拟机 ” ,再选择 “ 可移动设备 ” ,再选择 “ IMC NetWorks USB2.0 HD UVC WebCam ” ,最后点击 “ 连接 ” ,再弹出的窗口内点击 “ 确定 ” 。

此时再看虚拟机右下角的这个图标有没有绿点,有的话说明已经成功了。

在这里插入图片描述

播放视频

创建一个新的cpp文件:

vim main.cpp

在文件中输入以下代码:

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
        //从摄像头读取视频
        VideoCapture capture("cat.mp4");
        //循环显示每一帧
        while(1){
                Mat frame;//定义一个Mat变量,用于存储每一帧的图像
                capture >> frame;//读取当前帧
                if(frame.empty())//播放完毕,退出
                        break;
                imshow("读取视频帧",frame);//显示当前帧
                waitKey(30);//掩饰30ms
        }
        system("pause");
        return 0;
}

和图像处理一样编译:

g++ `pkg-config --cflags opencv4` main.cpp `pkg-config --libs opencv4` -o main.out

在这里插入图片描述

根据你写的路径(我这里是当前目录)保存一个同名视频:

在这里插入图片描述

执行可执行文件,系统播放视频:

在这里插入图片描述

摄像头录制

首先创建好源代码文件

vim test.cpp

在里面打上这些代码:

/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#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::VideoWriter::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++ `pkg-config --cflags opencv4` test.cpp `pkg-config --libs opencv4` -o test.out

在这里插入图片描述

运行效果:

在这里插入图片描述

如果有以下报错:

在这里插入图片描述

请查看虚拟机->设置->硬件->usb兼容性是否调的是usb3.0以上,不是的话先调成3.0以上,再重新在虚拟机->可移动设备->IMC NetWorks USB2.0 HD UVC WebCam重新连接,虽然usb兼容性是否调的是usb3.0以上但是也报这个错的话也试试重新在连接IMC NetWorks USB2.0 HD UVC WebCam。

退出录制后,在相对应的路径留下视频。

在这里插入图片描述

参考资料

  1. https://github.com/opencv/opencv/releases
  2. https://blog.csdn.net/spiremoon/article/details/105812303
  3. https://blog.csdn.net/laoluobo76/article/details/108302191
  4. https://blog.csdn.net/qq_44830040/article/details/105961295
  5. https://blog.csdn.net/ssj925319/article/details/109231145

猜你喜欢

转载自blog.csdn.net/weixin_54435584/article/details/126981559