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 格式)。 - Point 和 Size:表示二维点和尺寸,例如
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/
如果你有具体需求(例如处理视频、特征检测等),可以告诉我,我会提供更详细的代码和解释!