OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在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的支持。
应用领域:
①下载 OpenCV 4.6.0 数据包
国外官网下载地址:https://github.com/opencv/opencv/releases
国内gitee下载地址:https://gitee.com/OpenCVChina/opencv
②解压缩包
在home目录下将下载好的opencv4.6.0压缩包,移动到home目录下进行解压。
开始解压,执行解压命令
unzip opencv-4.6.0.zip
可以看到已经解压成功
③使用 cmake 安装 opencv
首先将解压后文件夹重命名为opencv,进入解压后的文件夹:opencv
cd opencv
使用命令安装cmake
sudo apt-get install cmake
安装完成后使用命令查看cmake是否安装成功
camke -version
接下来安装依赖库
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
注意:根据自己虚拟机的依赖库安装情况可以对下面图片红色框中的依赖库进行自由删减
创建一个build文件夹
mkdir build
再cd到该目录下
cd build
使用 cmake 编译参数,或者使用第二条默认参数,都可以的。
cmake -D WITH_TBB=ON -D WITH_EIGEN=ON -D OPENCV_GENERATE_PKGCONFIG=ON ..
cmake -D BUILD_DOCS=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF ..
cmake -D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=OFF ..
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
注意:执行该条命令需要再bulid文件夹下
④使用 make 创建编译
继续在bulid目录下操作
sudo make -j4
注意: sudo make 是使用单线程编译,需要等待较长时间,使用sudo make -j4 是指使用4个线程进行编译
⑤安装
sudo make install
修改 opencv.conf 文件,文件目录:/etc/ld.so.conf.d/opencv.conf,使用gedit打开文件,添加OpenCV安装目录:/usr/local/lib
注意保存
sudo gedit /etc/ld.so.conf.d/opencv.conf
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
可以看到出现找不到opencv.pc的问题,这时候我们需要手动创建opencv.pc
opencv.pc
cd /usr/local/lib
sudo mkdir pkgconfig && cd pkgconfig
sudo gedit opencv.pc
添加相关配置:
# Package Information for pkg-config
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/opencv4
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.6.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_ml -lopencv_video -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_objdetect -lopencv_dnn -lopencv_stitching -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}
再执行命令
pkg-config --modversion opencv
可以看到opencv安装成功
创建一个文件夹
mkdir opencvCode
创建程序test1.cpp
vim test1.cpp
写入程序代码
/*图像灰度化*/
#include
#include
using namespace std;
using namespace cv;
Mat src, gray;
int main()
{
src = imread("image.jpg");
if (src.empty())
{
cout << "没有读取到图像" << endl;
return -1;
}
//cvtColor(src, gray, COLOR_RGB2GRAY);
int row = src.rows;
int col = src.cols;
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;
}
}
使用g++编译器进行cpp文件的编译
注意:如果虚拟机没有安装g++需要执行以下命令安装g++
g++ -std=c++11 test1.cpp -o test1 `pkg-config --cflags --libs opencv4`
输入命令进行cpp文件编译
生成可执行文件成功,运行可执行文件
./test1
使用快捷键 Win + R ,输入 services.msc ,并回车。
找到程序VMware Authorization Service,确保已经启动
进入VMware应用,找到虚拟机设置选项
选择 “ USB控制器 ” ,将 “ USB兼容性 ” 设置为 “ USB 3.1 ” ,并点击确定。
选择 “ 虚拟机 ” ,再选择 “ 可移动设备 ” ,再选择 “ Quanta USB2.0 VGA UVC WebCam ” ,最后点击 “ 连接 ” ,再弹出的窗口内点击 “ 确定 ” 。
虚拟机右下角这个摄像头图标有个小绿点,则连接成功。
在上述opencvCode文件夹下,创建一个 test2.cpp 文件
sudo gedit test2.cpp
test2.cpp内容
#include
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture("hotpot.mp4");
//循环显示每一帧
while(1){
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame;//读取当前帧
if(frame.empty())//播放完毕,退出
break;
imshow("读取视频帧",frame);//显示当前帧
waitKey(30);//延时30ms
}
system("pause");
return 0;
}
代码讲解:
如果语句:VideoCapture capture(0),后面的参数设置为 0 ,则从摄像头读取视频并循环显示每一帧;如果设置为一个视频的文件名,比如:man.mp4 ,则会将视频读取并循环显示每一帧。
while 循环体中的 Mat 数据结构其实是一个点阵,对应图像上的每一个点,点的集合形成了一帧图像,有关 Mat 详解请看:OpenCV中Mat数据结构
语句:waitKey(30) ,中的参数单位是 ms 毫秒,也就是每一帧间隔 30 ms ,该语句时不能删除的,否则会执行错误,无法播放视频或录制视频。
编译test2.cpp文件
g++ -std=c++11 test2.cpp -o test2 `pkg-config --cflags --libs opencv4`
可以看到test2可执行文件已经生成,使用./test2运行查看效果
在上述opencvCode文件夹下,创建一个 test3.cpp 文件
sudo gedit test3.cpp
test3.cpp:
/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include
#include
#include
#include
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;
}
编译test3.cpp文件
g++ -std=c++11 test3.cpp -o test3 `pkg-config --cflags --libs opencv4`
可以看到test3可执行文件已经生成,使用./test3运行查看效果
Ubuntu18.04下OpenCV3.4.11的安装及使用示例