C++ OpenCV 基础操作

我将为你介绍 OpenCV 在 C++ 中的一些基础操作,包括图像读取、显示、保存、基本处理等常用功能。以下内容假设你已安装 OpenCV 库并配置好开发环境。

1. 环境配置

确保你的项目已正确链接 OpenCV 库。通常在 CMakeLists.txt 中需要包含:

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

2. 基本操作代码示例

以下是一个简单的 C++ 程序,展示 OpenCV 的基础功能:

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

using namespace cv;
using namespace std;

int main() {
    // 1. 读取图像
    Mat image = imread("example.jpg"); // 替换为你的图像路径
    if (image.empty()) {
        cout << "无法读取图像!" << endl;
        return -1;
    }

    // 2. 显示图像
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", image);

    // 3. 等待按键(0表示无限等待)
    waitKey(0);

    // 4. 保存图像
    imwrite("output.jpg", image);

    // 5. 基本图像处理:转换为灰度图
    Mat gray_image;
    cvtColor(image, gray_image, COLOR_BGR2GRAY);
    imshow("Gray Image", gray_image);
    waitKey(0);

    // 6. 调整图像大小
    Mat resized_image;
    resize(image, resized_image, Size(300, 300)); // 调整为 300x300
    imshow("Resized Image", resized_image);
    waitKey(0);

    // 7. 模糊处理
    Mat blurred_image;
    GaussianBlur(image, blurred_image, Size(5, 5), 0);
    imshow("Blurred Image", blurred_image);
    waitKey(0);

    // 8. 边缘检测
    Mat edges;
    Canny(gray_image, edges, 100, 200);
    imshow("Edges", edges);
    waitKey(0);

    // 销毁所有窗口
    destroyAllWindows();
    return 0;
}

3. 代码说明

  • 读取图像imread 用于加载图像,支持多种格式(如 JPG、PNG)。检查 image.empty() 确保图像正确加载。
  • 显示图像imshow 显示图像,namedWindow 创建显示窗口,waitKey 等待用户按键。
  • 保存图像imwrite 将图像保存到指定路径。
  • 灰度转换cvtColor 将彩色图像转换为灰度图像。
  • 调整大小resize 修改图像尺寸。
  • 高斯模糊GaussianBlur 应用高斯模糊,平滑图像。
  • 边缘检测Canny 检测图像边缘,适用于灰度图像。

4. 常用数据结构

  • Mat:OpenCV 的核心数据结构,表示图像矩阵。包含图像数据、宽度、高度、通道数等信息。
  cout << "图像尺寸: " << image.cols << "x" << image.rows << endl;
  cout << "通道数: " << image.channels() << endl;
  • Scalar:表示颜色值,例如 Scalar(0, 255, 0) 表示绿色(BGR 格式)。
  • PointSize:表示二维点和尺寸,例如 Point(100, 100)Size(300, 300)

5. 其他基础操作

  • 绘制图形
  // 画矩形
  rectangle(image, Point(50, 50), Point(150, 150), Scalar(0, 255, 0), 2);
  // 画圆
  circle(image, Point(100, 100), 50, Scalar(255, 0, 0), -1); // -1 表示填充
  imshow("Drawn Image", image);
  waitKey(0);
  • 访问像素
  // 访问并修改像素(BGR 格式)
  for (int i = 0; i < image.rows; i++) {
      for (int j = 0; j < image.cols; j++) {
          Vec3b &pixel = image.at<Vec3b>(i, j); // BGR 格式
          pixel[0] = 255; // 设置蓝色通道
      }
  }
  • ROI(感兴趣区域)
  Rect roi(100, 100, 200, 200); // x, y, width, height
  Mat roi_image = image(roi);
  imshow("ROI", roi_image);
  waitKey(0);

6. 注意事项

  • 图像格式:OpenCV 默认使用 BGR 颜色格式,而非 RGB。
  • 内存管理Mat 自动管理内存,但大图像操作时注意性能。
  • 异常处理:总是检查图像是否成功加载。
  • 版本兼容性:代码基于 OpenCV 4.x,若使用旧版本(如 3.x),某些函数可能略有差异。

7. 进阶学习建议

  • 学习 OpenCV 的模块:core(核心功能)、imgproc(图像处理)、highgui(界面操作)。
  • 探索更多功能:如特征检测(SIFT、ORB)、视频处理、机器学习模块。
  • 参考 OpenCV 官方文档:https://docs.opencv.org/

如果你有具体需求(例如处理视频、特征检测等),可以告诉我,我会提供更详细的代码和解释!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注