OpenCV C++ 示例大全

以下是 OpenCV 常用的 C++ 示例代码,涵盖图像处理、视频处理、特征检测等核心功能。

1. 基础示例

图像读取和显示

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
    
    if (image.empty()) {
        std::cout << "无法加载图像!" << std::endl;
        return -1;
    }
    
    // 显示图像
    cv::imshow("原始图像", image);
    
    // 获取图像信息
    std::cout << "图像宽度: " << image.cols << std::endl;
    std::cout << "图像高度: " << image.rows << std::endl;
    std::cout << "通道数: " << image.channels() << std::endl;
    
    // 等待按键
    cv::waitKey(0);
    return 0;
}

图像保存

cv::Mat image = cv::imread("input.jpg");
if (!image.empty()) {
    // 转换为灰度图
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    
    // 保存图像
    cv::imwrite("output_gray.jpg", gray);
    std::cout << "图像保存成功!" << std::endl;
}

2. 图像处理示例

图像转换

// 转换为灰度图
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

// 转换为HSV颜色空间
cv::Mat hsv;
cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);

// 调整亮度和对比度
cv::Mat adjusted;
image.convertTo(adjusted, -1, 1.5, 50); // alpha=1.5, beta=50

图像滤波

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

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

// 双边滤波
cv::Mat bilateral;
cv::bilateralFilter(image, bilateral, 9, 75, 75);

边缘检测

// Canny边缘检测
cv::Mat edges;
cv::Canny(image, edges, 100, 200);

// Sobel算子
cv::Mat grad_x, grad_y;
cv::Sobel(image, grad_x, CV_16S, 1, 0);
cv::Sobel(image, grad_y, CV_16S, 0, 1);
cv::convertScaleAbs(grad_x, grad_x);
cv::convertScaleAbs(grad_y, grad_y);
cv::Mat sobel;
cv::addWeighted(grad_x, 0.5, grad_y, 0.5, 0, sobel);

3. 视频处理示例

摄像头捕获

cv::VideoCapture cap(0); // 打开默认摄像头

if (!cap.isOpened()) {
    std::cout << "无法打开摄像头!" << std::endl;
    return -1;
}

cv::Mat frame;
while (true) {
    cap >> frame; // 捕获帧
    
    if (frame.empty()) break;
    
    // 处理帧(例如转换为灰度)
    cv::Mat gray;
    cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
    
    cv::imshow("摄像头", gray);
    
    if (cv::waitKey(1) == 27) break; // 按ESC退出
}

cap.release();
cv::destroyAllWindows();

视频文件处理

cv::VideoCapture cap("video.mp4");

if (!cap.isOpened()) {
    std::cout << "无法打开视频文件!" << std::endl;
    return -1;
}

// 获取视频属性
double fps = cap.get(cv::CAP_PROP_FPS);
int width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);

std::cout << "FPS: " << fps << ", 分辨率: " 
          << width << "x" << height << std::endl;

cv::Mat frame;
while (cap.read(frame)) {
    cv::imshow("视频", frame);
    if (cv::waitKey(1000/fps) == 27) break;
}

cap.release();

4. 特征检测示例

人脸检测

// 加载人脸检测器
cv::CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_default.xml")) {
    std::cout << "无法加载人脸检测模型!" << std::endl;
    return -1;
}

cv::Mat image = cv::imread("people.jpg");
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

// 检测人脸
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 3, 0, cv::Size(30, 30));

// 绘制检测结果
for (const auto& face : faces) {
    cv::rectangle(image, face, cv::Scalar(0, 255, 0), 2);
}

cv::imshow("人脸检测", image);
cv::waitKey(0);

角点检测

// Harris角点检测
cv::Mat gray, dst, dst_norm;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

cv::cornerHarris(gray, dst, 2, 3, 0.04);
cv::normalize(dst, dst_norm, 0, 255, cv::NORM_MINMAX, CV_32FC1);

// 绘制角点
for (int i = 0; i < dst_norm.rows; i++) {
    for (int j = 0; j < dst_norm.cols; j++) {
        if (dst_norm.at<float>(i, j) > 150) {
            cv::circle(image, cv::Point(j, i), 5, cv::Scalar(0, 0, 255), 2);
        }
    }
}

5. 图像变换示例

几何变换

// 缩放
cv::Mat resized;
cv::resize(image, resized, cv::Size(), 0.5, 0.5); // 缩小一半

// 旋转
cv::Point2f center(image.cols/2.0, image.rows/2.0);
cv::Mat rot = cv::getRotationMatrix2D(center, 45, 1.0); // 旋转45度
cv::Mat rotated;
cv::warpAffine(image, rotated, rot, image.size());

// 仿射变换
cv::Point2f src_pts[3] = {{0,0}, {image.cols-1,0}, {0,image.rows-1}};
cv::Point2f dst_pts[3] = {{50,50}, {image.cols-60,30}, {40,image.rows-50}};
cv::Mat affine = cv::getAffineTransform(src_pts, dst_pts);
cv::Mat warped;
cv::warpAffine(image, warped, affine, image.size());

6. 图像分割示例

阈值分割

cv::Mat gray, binary;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

// 二值化
cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY);

// 自适应阈值
cv::Mat adaptive;
cv::adaptiveThreshold(gray, adaptive, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, 
                     cv::THRESH_BINARY, 11, 2);

轮廓检测

cv::Mat gray, binary;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY);

std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;

cv::findContours(binary, contours, hierarchy, 
                cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);

// 绘制轮廓
cv::Mat result = image.clone();
cv::drawContours(result, contours, -1, cv::Scalar(0, 255, 0), 2);

7. 编译命令

Linux/macOS

g++ -std=c++11 example.cpp -o example \
    `pkg-config --cflags --libs opencv4`

Windows (Visual Studio)

在项目属性中添加:

  • 包含目录: C:\opencv\build\include
  • 库目录: C:\opencv\build\x64\vc16\lib
  • 附加依赖项: opencv_world490.lib (Release)
  • 附加依赖项: opencv_world490d.lib (Debug)

CMake 项目

cmake_minimum_required(VERSION 3.10)
project(OpenCVExample)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(example example.cpp)
target_link_libraries(example ${OpenCV_LIBS})

这些示例涵盖了 OpenCV 最常用的功能,可以根据实际需求进行修改和扩展。

Logo

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

更多推荐