Ubantu18.04环境下使用OpenCV进行图像、视频处理 (附OpenCV安装卸载教程)

3 篇文章 0 订阅
1 篇文章 0 订阅

写在前面的安装建议(善用快照,不再崩溃)

因为这个openCV的安装相当费时,又容易出错,本人在这次实验中真是深受折磨,帮室友都装完了,自己还是报错,所以有一些安装建议给初学者。

  1. 首先就是善用VMware中的快照功能,这个功能能够保存你虚拟机当前的状态,就算你死机了也能人生重来。
  • 拍摄快照在这里插入图片描述
  • 从快照管理器中恢复快照 在这里插入图片描述
  1. 其次就是,建议安装一个VMware tools,非常简单,五分钟就好了。有了这个之后,你到时候就可以直接复制代码到虚拟机的终端中了,视频也可以直接从主机拖到虚拟机中。
    (终端中复制粘贴不是ctrl+c/v,而是ctrl+shift+c/v)
    安装步骤具体百度,或者看这个教程:两种方法在VMware中安装VMware Tools

一、安装OpenCV

环境:

  • Ubantu 18.04
  • Vmware16
  • OpenCV 3.4.12

1.如何编译安装OpenCV

2.安装过程的问题

  1. 编译的时候博客里给的命令是 sudo make -j8,指的是8线程编译,还可以使用四线程编译与单线程编译,分别的命令是
sudo make -j4
sudo make 
//这里我推荐4线程,因为8线程容易报错中断,而单线程又太慢了。
//(担心出错的朋友可以使用单线程,可能得花20分组左右)
  1. 验证OpenCV版本
    安装结束后,输入命令pkg-config opencv --modversion可以检验自己的版本号,如果能够正确显示版本号,则表示安装成功。
    在这里插入图片描述
  2. 未能解决的问题
    最初我安装时参考的是这篇博客:Ubuntu18.04下OpenCV3.4.11的安装及使用示例
    但是后来进行图像处理时出现了以下的问题,查阅了资料之后也没能很好解决,网上给出的办法很多都是重新安装,所以我后来参考了文首的那篇博客。在这里插入图片描述

3. 卸载OpenCV

为什么要卸载OpenCV,因为失败是成功之母。
参考的这篇文章:[详细教程] opencv的完全卸载和重新安装
因为装错了版本、报了一堆莫名其妙的错之类的,总之该踩的雷本人都踩完了,如果你不幸没有保存快照,只有卸载重装了。
本人已经熟练地掌握了OpenCV的卸载技巧,请大家欣赏。

  1. 首先进入你OpenCV中的bulid文件夹,可以点进去,或者输入命令cd build进入。
  2. 然后输入命令
sudo make uninstall
cd ..
sudo rm -r build
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*

然后输入命令检查版本号pkg-config opencv --modversion,若没有显示版本号则表示卸载完成了,随后输入最后一条命令命令清除干净

sudo apt-get autoremove opencv-doc opencv-data libopencv-dev libopencv2.4-java libopencv2.4-jni python-opencv libopencv-core2.4 libopencv-gpu2.4 libopencv-ts2.4 libopencv-photo2.4 libopencv-contrib2.4 libopencv-imgproc2.4 libopencv-superres2.4 libopencv-stitching2.4 libopencv-ocl2.4 libopencv-legacy2.4 libopencv-ml2.4 libopencv-video2.4 libopencv-videostab2.4 libopencv-objdetect2.4 libopencv-calib3d2.4

如果你还未卸载成功,可以借鉴这篇暴力的卸载文章
Linux下OpenCV的卸载与安装(完全卸载与快捷安装任何版本)

二、使用OpenCV处理图片

1. 图像处理过程

首先在创建一个空白文件夹code

mkdir code
cd code

在这里插入图片描述
输入命令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("star.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;
        src=cvarrToMat(image);
        imwrite("test.png",src);
        imshow("test",src);

        cvWaitKey();
        return 0;
}

随后输入以下命令进行文件的编译
``g++ test.cpp -o test `pkg-config --cflags --libs opencv```
随后在文件夹中准备一张图片,命名为star.jpg (这个名字由你文件名与文件格式决定)

在这里插入图片描述
输入命令./test执行命令,随后可以发现生成了一个test.png图片
在这里插入图片描述

以下是两张小猫图片的对比
在这里插入图片描述
在这里插入图片描述

2. 关于代码的思考

编译命令是如何获得opencv头文件,并链接到链接lib库文件的路径:

头文件的获取是通过命令行pkg-config --cflags --libs opencv来进行获取的,因为我们知道gcc的编译过程,在文件进行编译时,进行一系列头文件的调用,而上述命令就是在执行文件的编译链接,所以我认为链接的方法是这样。

三、使用OpenCV处理视频

1. 使用OpenCV播放硬盘视频:

输入命令gedit test2.cpp创建源文件
复制以下源码进入文件

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

需要在源码的文件夹放置一个视频,命名为man.mp4(由你的代码与视频名字决定)。
然后输入命令g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
随后输入命令./test2可以打开视频
在这里插入图片描述

可能会报一个错sh:1:pause:not found,但视频会正常播放,无伤大雅,有兴趣可以百度一下。
在这里插入图片描述

2. 录视频

  • 使用同样步骤,创建文件test3.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_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 虚拟机下使用摄像头

以下是本人打开摄像头时遇到的错误与问题:

若不能打开摄像头请试试以下方法

  • 虚拟机设置中USB控制器是否存在,并且调为USB 3.1USB3.0
    在这里插入图片描述
  • 虚拟机的可移动设备IMC Networks HD Camera是否连接,未勾选过的话,可以点击勾选
    在这里插入图片描述
  • 如果还是打不开的话,可以试着把可移动设备中的其他USB设备断开,如网络适配器声卡,因为可能存在USB冲突的问题
    在这里插入图片描述

3. 关于代码的思考

  1. 如何修改代码以打开硬盘视频
    对比打开硬盘视频与打开摄像头的代码可知,差异的一句在于VideoCapture capture("xxx");,若你填写参数xxx为一个硬盘中的视频文件名,例如man.mp4,则会打开该mp4视频,若填写为0,则读取的是摄像头中的视频
  2. 代码中,Mat是一个什么数据结构
    Mat是一个类。由两部分数据组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。
    这里是详细的介绍【OpenCV学习笔记】之Mat结构与基本数据结构、函数
  3. 什么一定要加一句waitKey延时代码
    waitKey()函数的功能是不断刷新图像,这样便于刷新储存每一帧图像,不会造成视频卡顿之类的问题,如果不加入延时的话会导致视频显示窗口无法显示。
  4. 能否改进代码快捷地关闭录制窗口
    可以加入一些判断语句,来执行录制的中断操作
    key = waitKey(1) & 0xff; //按q键退出
    if(key == 'q') break;

四、总结

本次实验虽然过程很不顺利,但终于结果是好的(重装了4次OpenCV,虚拟机黑屏崩溃了n次)。这次实验里面学习了如何安装OpenCV(顺便也学习了如何卸载),并且练习了如何用OpenCV进行简单的编程,并进行编译,完成了简单的图像处理、视频播放、视频录制,并对OpenCV有了一个初步的了解与认识,如果还有机会,一定系统地学习一下。

五、参考文献

Ubuntu18.04安装OpenCV进行图像编程
ubuntu安装opencv的正确方法
Ubuntu18.04下OpenCV3.4.11的安装及使用示例
Ubuntu安装播放mp4格式视频(安装ffmpeg)
[详细教程opencv的完全卸载和重新安装
两种方法在VMware中安装VMware Tools
Linux下OpenCV的卸载与安装(完全卸载与快捷安装任何版本)
ubuntu 虚拟机下使用摄像头
OpenCV/opencv_contrib国内快速下载

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值