当前位置:   article > 正文

linux中opencv的安装与简单调用_linux opencv

linux opencv


一、opencv简介

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


二、linux中安装opencv

1、官网下载opencv-3.4.1
在这里插入图片描述

2、解压后,将文件夹复制到Ubuntu系统中,注意存放位置
在这里插入图片描述
2、进入opencv文件夹,安装依赖库和cmake ,如果提醒需要apt-get update,输入sudo apt-get update,然后执行

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

  • 1
  • 2

3、创建编译的文件夹

mkdir build_test
  • 1

4、进入创建好的文件夹,cmake创建make文件夹

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

  • 1
  • 2

时刻检查注意自己的当前工作目录

5、编译库,这里为提高编译速度,使用多线程并行方式,最高线程数为自己处理器内核数的两倍,这里使用4线程,make -j4

sudo make -j4
  • 1

大概需要12分钟~

编译完成后执行安装

sudo make install
  • 1

6、接下来配置opencv的环境

  • 先将库添加到系统可以找到的路径
sudo gedit /etc/ld.so.conf.d/opencv.conf 

  • 1
  • 2
  • 在打开的文件中复制下面的语句,保存退出
/usr/local/lib  

  • 1
  • 2
  • 执行命令使路径生效
sudo ldconfig  

  • 1
  • 2
  • 配置bash
sudo gedit /etc/bash.bashrc  

  • 1
  • 2
  • 在末尾添加下面的内容,保存退出
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  

  • 1
  • 2
  • 3
  • 执行生效命令
source /etc/bash.bashrc  

  • 1
  • 2
  • 更新环境配置
sudo updatedb  

  • 1
  • 2

opencv安装成功


三、简单图像处理与图像录制

(一)简单特效处理

1、准备图片素材,将图片与程序文件放到同意目录下,本例都放到opencv目录下
在这里插入图片描述

2、跳转到opencv目录中,创建编写c文件test1.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("7.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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

3、编译,使用 g++

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

  • 1
  • 2

在上面的编译命令中我们其实用到了一个工具“pkg-config”,它主要有以下几个功能:

1.检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
2.获得编译预处理参数,如宏定义,头文件的位置。
3.获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
4.自动加入所依赖的其它库的设置

有了这个工具之后我们的编译就很方便了(不过在此之前你要确保你安装的OpenCV的安装链接库文件的目录下有一个pkgconfig文件夹,在该文件夹里面有个opencv.pc的文件,其实这就是pkg-config下OpenCV的配置文件)。

使用pkg-config时,选项–cflags 它是用来指定程序在编译时所需要头文件所在的目录,选项 --libs则是指定程序在链接时所需要的动态链接库的目录。
(以上内容来自:https://www.cnblogs.com/Crysaty/p/6638152.html)

  • 编译完成后运行程序 test
./test
  • 1
  • 运行效果,左图为原图

(二)图像播放与录制

1、调用opencv用摄像头显示图像的最简程序,首先要将摄像头连接到虚拟机

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0); //读入视频,实例化的同时再初始化
//循环显示每一帧
while(1)
{
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
capture>>frame; //读取当前帧
imshow("读取视频",frame); //显示当前帧
waitKey(30); //延时30MS
}
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

程序中的 Mat 是一个类,用于读取图像。且需要加延时语句,因为帧的读取与显示需要时间。
如果要播放本机视频,将 VideoCapture capture 的参数 0 换成 “图片路径 ”

此程序结束时只能通过 ctrl+c 强制退出,需要添加检测播放结束和退出键

//若视频播放完成,退出循环
if(frame.empty())
{
break;
}
imshow("读取视频",frame); //显示当前帧
waitKey(30); //延时30MS
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、摄像头图像操作改进版

/*********************************************************************
打开电脑摄像头,空格控制视频录制,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;

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

	//获得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();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

以上所有程序编译时切记链接库函数,逐步执行便可大功告成 ✌

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/623362
推荐阅读
相关标签
  

闽ICP备14008679号