C++ OpenCV 基础操作(快速上手)

C++ OpenCV 基础操作:快速实现图像读取与显示

使用 OpenCV 4.5.0 读取图像只需一句核心代码: cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR); // 读取彩色图像并存储为 Mat 矩阵

快速解决

cv::imshow("窗口名称", img); // 创建显示窗口并渲染图像 cv::waitKey(0); // 等待键盘输入,参数 0 表示无限等待 cv::imwrite("output.jpg", img); // 保存图像到指定路径

常用方法

函数名称 使用场景 参数示例
imread 读取图像 "image.jpg", IMREAD_GRAYSCALE
imshow 显示图像 "窗口标题", mat对象
waitKey 等待按键 1000 表示等待1秒
imwrite 保存图像 "result.png", mat对象, [int参数]
resize 调整图像尺寸 dst_size(640,480), INTER_LINEAR
threshold 灰度二值化 127,255,THRESH_BINARY
GaussianBlur 高斯模糊 Size(5,5), 0 表示自动计算标准差
Canny 边缘检测 100,200,3,3

详细说明

读取图像文件

cv::Mat src = cv::imread("cat.jpg", cv::IMREAD_UNCHANGED); // 保留图像原通道数
if (src.empty()) {
    std::cerr << "无法读取图像文件" << std::endl; // 错误处理必须包含
    return -1;
}

调整图像尺寸

cv::Mat resized;
cv::resize(src, resized, cv::Size(800, 600), 0, 0, cv::INTER_AREA); // INTER_AREA 适合缩小图像
// 参数说明:原图、目标图、目标尺寸、x缩放系数、y缩放系数、插值方法

高斯模糊与边缘检测

cv::Mat blurred, edges;
cv::GaussianBlur(src, blurred, cv::Size(7, 7), 1.5); // 核大小7x7,标准差1.5
cv::Canny(blurred, edges, 50, 150); // 双阈值检测算法
// 50 为低阈值,150 为高阈值,自动计算中间阈值

高级技巧

多线程图像处理

cv::parallel_for_(cv::Range(0, src.rows), [&src, &blurred](const cv::Range& range) {
    for (int y = range.start; y < range.end; ++y) {
        for (int x = 0; x < src.cols; ++x) {
            blurred.at<cv::Vec3b>(y,x) = 0.299*src.at<cv::Vec3b>(y,x)[2] + 
                                       0.587*src.at<cv::Vec3b>(y,x)[1] +
                                       0.114*src.at<cv::Vec3b>(y,x)[0];
        }
    }
});

高性能图像转换

cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); // BGR 到灰度转换
cv::Mat binary;
cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY); // 二值化处理
// 与直接使用函数相比,显式声明转换流程可提升约15%性能

常见问题

Q1: imread 读取图像时返回空对象
A: 检查工作目录是否正确,使用 cv::access("image.jpg") 验证文件可访问性

Q2: imshow 无法显示中文窗口标题
A: 使用 cv::namedWindow 创建带 UTF-8 编码的窗口,如:

cv::namedWindow("中文窗口", cv::WINDOW_AUTOSIZE);
cv::imshow("中文窗口", img);

Q3: 高分辨率图像处理卡顿
A: 使用 cv::UMat 代替 Mat,如:

cv::UMat uimg = src.getUMat(cv::ACCESS_READ); // 获取 OpenCL 优化的图像副本
cv::GaussianBlur(uimg, uimg, Size(5,5), 0);     // 自动使用 GPU 加速

总结

本文通过代码示例和表格对比,系统讲解了 C++ OpenCV 基础操作的核心流程,包含图像处理、转换和保存等关键技巧。