OpenCV 全面介绍

OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库,由 Intel 发起并持续维护。它包含了数百种计算机视觉算法,是计算机视觉领域最流行的库之一。

1. 核心特性

跨平台支持

  • 操作系统: Windows, Linux, macOS, Android, iOS
  • 语言支持: C++, Python, Java, JavaScript
  • 硬件加速: CPU优化指令集(SSE, AVX), GPU(CUDA), OpenCL

丰富的功能模块

  • 图像处理: 滤波、变换、形态学操作
  • 视频分析: 运动检测、目标跟踪
  • 特征检测: 角点、边缘、关键点检测
  • 机器学习: 分类、聚类、神经网络
  • 相机标定: 相机校正、3D重建
  • GUI支持: 图像显示、交互界面

2. 主要模块组成

模块 功能描述
core 核心功能,基本数据结构
imgproc 图像处理,滤波,几何变换
imgcodecs 图像文件读写
videoio 视频捕获和编解码
highgui 高级GUI和媒体IO
video 视频分析,运动估计
calib3d 相机标定,3D重建
features2d 特征检测和描述
objdetect 目标检测
ml 机器学习算法
dnn 深度学习模块

3. 基本使用示例

C++ 示例

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("image.jpg");
    
    // 转换为灰度图
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    
    // 显示图像
    cv::imshow("Original", image);
    cv::imshow("Gray", gray);
    
    // 保存图像
    cv::imwrite("gray_image.jpg", gray);
    
    cv::waitKey(0);
    return 0;
}

Python 示例

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg')

# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 边缘检测
edges = cv2.Canny(gray, 100, 200)

# 显示结果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 核心数据结构

cv::Mat - 图像矩阵

// 创建不同格式的图像矩阵
cv::Mat mat1(480, 640, CV_8UC3);  // 480x640, 8位无符号3通道
cv::Mat mat2 = cv::Mat::zeros(100, 100, CV_32F);  // 100x100浮点零矩阵

// 访问像素值
uchar pixel_value = mat1.at<uchar>(y, x);  // 灰度图
cv::Vec3b color_pixel = mat1.at<cv::Vec3b>(y, x);  // 彩色图

5. 图像处理功能

图像滤波

cv::Mat blurred;
cv::GaussianBlur(image, blurred, cv::Size(5, 5), 0);  // 高斯模糊

cv::Mat median;
cv::medianBlur(image, median, 5);  // 中值滤波

边缘检测

cv::Mat edges;
cv::Canny(image, edges, 50, 150);  // Canny边缘检测

形态学操作

cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
cv::Mat eroded;
cv::erode(image, eroded, kernel);  // 腐蚀操作

6. 特征检测与匹配

关键点检测

// SIFT特征检测
cv::Ptr<cv::SIFT> sift = cv::SIFT::create();
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;
sift->detectAndCompute(image, cv::noArray(), keypoints, descriptors);

特征匹配

cv::BFMatcher matcher(cv::NORM_L2);
std::vector<cv::DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

7. 目标检测

人脸检测

cv::CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_default.xml");

std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 3);

for (const auto& face : faces) {
    cv::rectangle(image, face, cv::Scalar(255, 0, 0), 2);
}

深度学习目标检测

cv::dnn::Net net = cv::dnn::readNetFromDarknet("yolov3.cfg", "yolov3.weights");
net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);

cv::Mat blob = cv::dnn::blobFromImage(image, 1/255.0, cv::Size(416, 416));
net.setInput(blob);
cv::Mat outputs = net.forward();

8. 视频处理

视频捕获

cv::VideoCapture cap(0);  // 打开摄像头
// cv::VideoCapture cap("video.mp4");  // 打开视频文件

cv::Mat frame;
while (cap.read(frame)) {
    cv::imshow("Video", frame);
    if (cv::waitKey(30) == 27) break;  // ESC键退出
}

视频写入

cv::VideoWriter writer("output.avi", 
                      cv::VideoWriter::fourcc('M','J','P','G'), 
                      30, 
                      cv::Size(640, 480));

writer.write(frame);

9. 相机标定

std::vector<std::vector<cv::Point3f>> object_points;
std::vector<std::vector<cv::Point2f>> image_points;

// 采集标定板图像
// ...

cv::Mat camera_matrix, dist_coeffs;
std::vector<cv::Mat> rvecs, tvecs;

double error = cv::calibrateCamera(object_points, image_points, 
                                  image_size, camera_matrix, 
                                  dist_coeffs, rvecs, tvecs);

10. 机器学习

K-means聚类

cv::Mat data;  // 样本数据
int cluster_count = 3;
cv::Mat labels, centers;

cv::kmeans(data, cluster_count, labels, 
          cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 10, 1.0),
          3, cv::KMEANS_PP_CENTERS, centers);

SVM分类

cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
svm->setType(cv::ml::SVM::C_SVC);
svm->setKernel(cv::ml::SVM::RBF);

cv::Mat train_data, train_labels;
svm->train(train_data, cv::ml::ROW_SAMPLE, train_labels);

cv::Mat prediction = svm->predict(test_data);

11. 安装与配置

Ubuntu 安装

sudo apt-get install libopencv-dev python3-opencv

Python 安装

pip install opencv-python  # 基础版
pip install opencv-contrib-python  # 完整版

CMake 配置

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(your_target ${OpenCV_LIBS})

12. 应用领域

  1. 安防监控: 人脸识别、行为分析
  2. 医疗影像: 病灶检测、图像分割
  3. 自动驾驶: 车道检测、障碍物识别
  4. 工业检测: 产品质量检测
  5. 增强现实: 姿态估计、3D重建
  6. 机器人: 视觉导航、目标抓取

OpenCV 的强大功能和跨平台特性使其成为计算机视觉领域的标准工具,无论是学术研究还是工业应用都广泛使用。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐