本文主要叙述了OpenCV3.4.14安装及使用示例
操作系统:Ubuntu Desktop 18.04
一、简介
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的支持。[1]
OpenCV的应用领域主要包括以下几个方面
- 人机互动
- 物体识别
- 图像分割
- 人脸识别
- 动作识别
- 运动跟踪
- 机器人
- 运动分析
- 机器视觉
- 结构分析
- 汽车安全驾驶
二、安装
1.下载安装包
在OpenCV的官网上面下载,或者在GitHub上面下载OpenCV,推荐在国内镜像网站上面下载OpenCV。下载地址如下
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系统下开发视频软件。