C++ OpenCV 基本模块介绍
OpenCV 是一个功能强大的计算机视觉库,包含多个模块,每个模块专注于不同的任务。
以下是 OpenCV 中一些核心模块:
模块名称 | 主要功能 | 常用类/函数 |
---|---|---|
Core | 提供基本数据结构和函数,如图像存储、矩阵操作、文件 I/O 等。 | Mat , Point , Size , Rect , Scalar , FileStorage , cv::format |
Imgproc | 图像处理功能,包括滤波、几何变换、颜色空间转换、边缘检测、形态学操作、阈值化等。 | cvtColor , GaussianBlur , Canny , threshold , resize , warpAffine |
Highgui | 图像和视频的显示、窗口管理、用户交互(如鼠标事件、滑动条)。 | imshow , namedWindow , waitKey , createTrackbar , setMouseCallback |
Video | 视频处理功能,包括视频捕获、背景减除、光流计算等。 | VideoCapture , VideoWriter , BackgroundSubtractor , calcOpticalFlowPyrLK |
Calib3d | 相机标定、3D 重建、姿态估计等。 | findChessboardCorners , calibrateCamera , solvePnP , recoverPose |
Features2d | 特征检测与描述,包括关键点检测、特征匹配等。 | ORB , SIFT , SURF , BFMatcher , FlannBasedMatcher |
Objdetect | 目标检测功能,如 Haar 级联检测、HOG 检测等。 | CascadeClassifier , HOGDescriptor |
DNN | 深度学习模型的加载和推理,支持 TensorFlow、PyTorch、Caffe 等框架。 | readNet , blobFromImage , Net::forward |
ML | 机器学习算法,如 KNN、SVM、决策树等。 | KNearest , SVM , DTrees , TrainData |
Flann | 快速近似最近邻搜索(FLANN),用于特征匹配和高维数据搜索。 | Index , KDTreeIndexParams , SearchParams |
Photo | 图像修复、去噪、HDR 成像等。 | inpaint , fastNlMeansDenoising , createTonemap |
Stitching | 图像拼接功能,用于创建全景图。 | Stitcher , Stitcher::create |
Shape | 形状分析和匹配。 | ShapeDistanceExtractor , ShapeContextDistanceExtractor |
Tracking | 目标跟踪算法,如 MIL、KCF、GOTURN 等。 | TrackerMIL , TrackerKCF , TrackerGOTURN |
Videoio | 视频输入输出功能,支持多种视频格式和摄像头。 | VideoCapture , VideoWriter , CAP_PROP_FRAME_WIDTH , CAP_PROP_FRAME_HEIGHT |
Imgcodecs | 图像文件的读取和保存,支持多种图像格式。 | imread , imwrite , imdecode , imencode |
Xfeatures2d | 额外的特征检测与描述算法,如 SIFT、SURF、FREAK 等。 | SIFT , SURF , FREAK , DAISY |
Superres | 超分辨率图像处理。 | SuperResolution , DenseOpticalFlowExt |
Optflow | 光流计算和运动分析。 | calcOpticalFlowFarneback , calcOpticalFlowPyrLK |
Cuda | 利用 GPU 加速的计算机视觉算法。 | cuda::GpuMat , cuda::Stream , cuda::resize |
Contrib | 社区贡献的额外功能,如人脸识别、文本检测等。 | FaceRecognizer , TextDetector |
1. Core模块
core
模块是 OpenCV 的核心模块,提供了基本的数据结构和函数。
主要功能
-
基本数据结构:
-
Mat
:用于存储图像和矩阵数据。 -
Point
、Size
、Rect
:用于表示点、尺寸和矩形区域。 -
Scalar
:用于表示颜色或像素值。
-
-
矩阵操作:
-
矩阵的创建、复制、转换、算术运算等。
-
-
文件 I/O:
-
读取和保存图像、视频、XML/YAML 文件等。
-
-
内存管理:
-
自动内存管理,支持引用计数。
-
实例
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// 创建一个 3x3 的矩阵
Mat mat = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
// 输出矩阵
cout << "Matrix:\n" << mat << endl;
// 访问矩阵元素
int value = mat.at<int>(1, 1);
cout << "Value at (1, 1): " << value << endl;
return 0;
}
2. Imgproc 模块
imgproc
模块提供了图像处理功能,包括滤波、几何变换、颜色空间转换等。
主要功能
-
图像滤波:
-
均值滤波、高斯滤波、中值滤波等。
-
-
几何变换:
-
缩放、旋转、仿射变换、透视变换等。
-
-
颜色空间转换:
-
RGB 到灰度、HSV、Lab 等颜色空间的转换。
-
-
边缘检测:
-
Canny、Sobel、Laplacian 等边缘检测算法。
-
-
形态学操作:
-
腐蚀、膨胀、开运算、闭运算等。
-
-
阈值化:
-
简单阈值化、自适应阈值化等。
-
实例
#include <opencv2/highgui.hpp>
using namespace cv;
int main() {
// 读取图像
Mat image = imread("test.jpg");
if (image.empty()) return -1;
// 转换为灰度图像
Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);
// 高斯滤波
Mat blurredImage;
GaussianBlur(grayImage, blurredImage, Size(5, 5), 0);
// 显示结果
imshow("Original Image", image);
imshow("Blurred Image", blurredImage);
waitKey(0);
return 0;
}
3. Highgui 模块
highgui
模块提供了图像和视频的显示、窗口管理以及用户交互功能。
主要功能
-
图像显示:
-
创建窗口、显示图像、等待用户输入。
-
-
视频捕获:
-
从摄像头或视频文件中读取帧。
-
-
用户交互:
-
鼠标事件、滑动条、按钮等。
-
实例
using namespace cv;
int main() {
// 读取图像
Mat image = imread("test.jpg");
if (image.empty()) return -1;
// 创建窗口并显示图像
namedWindow("Display Window", WINDOW_AUTOSIZE);
imshow("Display Window", image);
// 等待用户按键
waitKey(0);
// 关闭窗口
destroyAllWindows();
return 0;
}
4. Video 模块
video
模块提供了视频处理功能,包括视频捕获、背景减除、光流计算等。
主要功能
-
视频捕获:
-
从摄像头或视频文件中读取帧。
-
-
背景减除:
-
提取视频中的前景对象。
-
-
光流计算:
-
计算图像中物体的运动。
-
实例
#include <opencv2/highgui.hpp>
using namespace cv;
int main() {
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened()) return -1;
Mat frame;
while (true) {
// 读取一帧
cap >> frame;
if (frame.empty()) break;
// 显示帧
imshow("Camera Feed", frame);
// 按下 ESC 键退出
if (waitKey(30) == 27) break;
}
// 释放摄像头并关闭窗口
cap.release();
destroyAllWindows();
return 0;
}
5. Calib3d 模块
calib3d
模块提供了相机标定、3D 重建、姿态估计等功能。
主要功能
-
相机标定:
-
计算相机内参和畸变系数。
-
-
3D 重建:
-
从多视图图像中重建 3D 场景。
-
-
姿态估计:
-
估计物体的 3D 姿态。
-
实例
#include <opencv2/highgui.hpp>
using namespace cv;
int main() {
// 读取图像
Mat image1 = imread("left.jpg");
Mat image2 = imread("right.jpg");
if (image1.empty() || image2.empty()) return -1;
// 特征点检测与匹配
Ptr<Feature2D> detector = ORB::create();
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptors1, descriptors2;
detector->detectAndCompute(image1, noArray(), keypoints1, descriptors1);
detector->detectAndCompute(image2, noArray(), keypoints2, descriptors2);
BFMatcher matcher(NORM_HAMMING);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
// 计算基础矩阵
vector<Point2f> points1, points2;
for (const auto& match : matches) {
points1.push_back(keypoints1[match.queryIdx].pt);
points2.push_back(keypoints2[match.trainIdx].pt);
}
Mat fundamentalMatrix = findFundamentalMat(points1, points2, FM_RANSAC);
// 输出基础矩阵
cout << "Fundamental Matrix:\n" << fundamentalMatrix << endl;
return 0;
}
6. DNN 模块
dnn
模块提供了深度学习模型的加载和推理功能。
主要功能
-
模型加载:
-
支持 TensorFlow、PyTorch、Caffe 等框架的模型。
-
-
推理:
-
对图像进行分类、目标检测、语义分割等。
-
实例
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace dnn;
int main() {
// 加载模型
Net net = readNetFromTensorflow("model.pb", "config.pbtxt");
// 读取图像
Mat image = imread("test.jpg");
if (image.empty()) return -1;
// 预处理
Mat blob = blobFromImage(image, 1.0, Size(300, 300), Scalar(127.5, 127.5, 127.5), true, false);
net.setInput(blob);
// 推理
Mat output = net.forward();
// 处理输出
// ...
return 0;
}