OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实现许多应用程序的快速开发。OpenCV库主要用C++,Python和Java编写,支持的操作系统包括Windows、Linux、Mac OS X、Android和iOS。
一、OpenCV版本的历史
该库的发展历程自2000年,已经经历了多次版本迭代。下面我们一起来看看OpenCV历史版本的一些发展和更新:
1. OpenCV 1.0
OpenCV 1.0是第一个开放版本的OpenCV库,它包含了计算机视觉算法和核心组件。它提供了透视,非透视相机校准和点线兴趣区域等功能。然而,这个版本在不同平台之间通信方面的兼容性很差。
2. OpenCV 2.0
OpenCV 2.0是迄今为止最受欢迎和最广泛使用的版本。在这个版本中,添加了很多新的特性和算法,比如SIFT描述符,以及支持64位系统的编译器和库。
3. OpenCV 3.0
OpenCV 3.0中增加了全新的模块和改进算法,比如13种新的深度学习算法和加速芯片的支持等。此外,该版本引入了更加优化的函数和支持C++11的新API。
4. OpenCV 4.0
在OpenCV 4.0版本中,加入了对深度学习和人工智能的支持,包括支持TensorFlow、Caffe和ONNX等工具库。此外,该版本还增加了基于SSE4.1、AVX2和NEON的加速功能,为移动设备提供更快的计算速度。
二、OpenCV版本的安装
下面我们来看看OpenCV的安装过程。这里我们以OpenCV 4.5.1版本为例:
1. 安装依赖项
在Ubuntu上,首先需要安装依赖项:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential cmake git unzip pkg-config libjpeg-dev libpng-dev libtiff-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libgtk-3-dev libatlas-base-dev gfortran python3-dev python3-numpy libtbb2 libtbb-dev libdc1394-22-dev
2. 下载OpenCV
在下载前,先决定自己的安装路径,例如此处设置为/usr/local:
cd ~
mkdir opencv_build
cd opencv_build
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.1.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.1.zip
unzip opencv.zip
unzip opencv_contrib.zip
mv opencv-4.5.1 opencv
mv opencv_contrib-4.5.1 opencv_contrib
3. 编译和安装
开始编译和安装之前,我们需要使用cmake来进行配置:
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_SHARED_LIBS=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D WITH_FFMPEG=ON \
-D WITH_GTK=ON \
-D WITH_LIBV4L=ON \
-D WITH_V4L=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_opencv_python3=ON \
-D PYTHON3_EXECUTABLE=/usr/bin/python3 \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include ..
完成以上配置后,运行以下命令进行编译和安装:
make -j4
sudo make install
sudo ldconfig
三、OpenCV的使用
下面我们通过一个简单的例子,来介绍一下OpenCV的使用方法。
1. 利用OpenCV进行图像处理
首先,我们需要导入OpenCV库,使用以下代码:
#include <opencv2/opencv.hpp>
using namespace cv;
现在可以打开一张图片,并显示在窗口中。使用以下代码:
int main() {
Mat img = imread("image.jpg");
namedWindow("image", WINDOW_AUTOSIZE);
imshow("image", img);
waitKey(0);
return 0;
}
现在可以使用一些函数,比如Canny函数进行边缘检测。使用以下代码:
int main() {
Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
Mat edges;
Canny(img, edges, 50, 100);
namedWindow("edges", WINDOW_AUTOSIZE);
imshow("edges", edges);
waitKey(0);
return 0;
}
2. 利用OpenCV进行视频处理
同样,我们需要先进行OpenCV库的导入。使用以下代码:
#include <opencv2/opencv.hpp>
using namespace cv;
现在可以从摄像头中捕获视频,并将视频显示在窗口中。使用以下代码:
int main() {
VideoCapture cap(0);
if (!cap.isOpened()) {
return -1;
}
Mat frame;
namedWindow("video", WINDOW_AUTOSIZE);
while(true) {
cap >> frame;
imshow("video", frame);
if (waitKey(30) >= 0) break;
}
return 0;
}
如果要对视频进行处理,可以添加相关的代码,比如使用Canny函数进行边缘检测。使用以下代码:
int main() {
VideoCapture cap(0);
if (!cap.isOpened()) {
return -1;
}
Mat frame;
namedWindow("video", WINDOW_AUTOSIZE);
while(true) {
cap >> frame;
Mat edges;
Canny(frame, edges, 50, 100);
imshow("video", edges);
if (waitKey(30) >= 0) break;
}
return 0;
}
3. 利用OpenCV进行人脸识别
OpenCV还支持人脸识别功能,可以通过Haar级联分类器进行实现。使用以下代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_default.xml")) {
return -1;
}
VideoCapture cap(0);
if (!cap.isOpened()) {
return -1;
}
Mat frame;
namedWindow("video", WINDOW_AUTOSIZE);
while (true) {
cap >> frame;
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
std::vector<Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faces.size(); i++) {
Point center;
int radius;
center.x = cvRound((faces[i].x + faces[i].width*0.5));
center.y = cvRound((faces[i].y + faces[i].height*0.5));
radius = cvRound((faces[i].width + faces[i].height)*0.25);
circle(frame, center, radius, Scalar(0, 255, 0), 4, 8, 0);
}
imshow("video", frame);
if (waitKey(30) >= 0) break;
}
return 0;
}
四、OpenCV版本的未来发展
OpenCV版本的未来发展需要摆脱当前的限制,并扩大它的应用范围。未来的OpenCV应当更全面地支持深度学习、自然语言处理、语音识别等多领域的应用。除了继续优化计算机视觉算法和图像处理技术,并加强多种算法的兼容性,还需要进一步加强对教育和应用领域的支持和推广,让更多人能够用OpenCV来构建自己的应用程序。