C++ Opencv 图像处理(建议收藏)

快速解决

C++ Opencv 图像处理 中实现灰度化只需调用 cv::cvtColor 函数,将图像从 BGR 色域转换为灰度值,核心代码如下:

cv::Mat src = cv::imread("input.jpg"); // 读取彩色图像
cv::Mat gray; 
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); // 色域转换
cv::imwrite("gray_output.jpg", gray); // 保存结果

常用方法

函数名 使用频率 功能描述 参数说明
cvtColor ★★★★★ 颜色空间转换 源图像、目标图像、转换码
threshold ★★★★☆ 简单阈值分割 源图像、阈值、最大值
GaussianBlur ★★★★☆ 高斯模糊预处理 源图像、目标图像、核尺寸
Canny ★★★★ 边缘检测 源图像、高低阈值
imread/imwrite ★★★★ 图像读写操作 路径、图像矩阵
imshow ★★★☆☆ 窗口显示图像 窗口名称、图像矩阵
resize ★★★☆ 图像尺寸调整 源图像、目标大小

详细说明

颜色空间转换

cv::Mat src = cv::imread("input.jpg"); 
cv::Mat hsv;
cv::cvtColor(src, hsv, cv::COLOR_BGR2HSV); // 转换为HSV色域
cv::Mat mask;
cv::inRange(hsv, cv::Scalar(0,150,50), cv::Scalar(10,255,255), mask); // 提取特定颜色

关键代码说明:

  • cv::COLOR_BGR2HSV 表示从 BGR 色域转换为 HSV 色域
  • cv::inRange 通过设定阈值范围提取目标颜色区域

高斯模糊与边缘检测

cv::Mat blurred;
cv::GaussianBlur(src, blurred, cv::Size(5,5), 0); // 核尺寸5x5
cv::Mat edges;
cv::Canny(blurred, edges, 30, 100); // 检测30-100阈值边缘

参数优化建议:

  • 核尺寸建议使用奇数(如5,7)保持中心对称
  • 阈值组合需根据图像噪声程度调整(高阈值建议是低阈值2-3倍)

图像窗口显示

cv::namedWindow("Original", cv::WINDOW_AUTOSIZE); 
cv::imshow("Original", src); // 显示原始图像
cv::waitKey(0); // 等待按键关闭窗口

实用技巧:

  • 使用 cv::WINDOW_NORMAL 可自定义窗口大小
  • waitKey 参数 0 表示无限等待,非 0 表示毫秒级超时

高级技巧

多通道并行处理

std::vector<cv::Mat> channels;
cv::split(src, channels); // 分离BGR通道
channels[1] = channels[1] * 0.5; // 降低绿色通道亮度
cv::merge(channels, modified); // 合并通道生成新图像

适用场景:需要单独调整特定颜色通道的图像增强需求

自定义滤波器

float kernel[9] = {0,-1,0,-1,5,-1,0,-1,0}; 
cv::Mat kernelMat(3,3,CV_32F,kernel); 
cv::filter2D(src, sharpened, -1, kernelMat); // 应用锐化滤波

性能优化:

  • 使用 CV_32F 浮点类型保证运算精度
  • 避免频繁创建临时矩阵(使用 cv::Mat::zeros 重用内存)

常见问题

Q1: 处理大尺寸图像时程序崩溃

A1: 使用 cv::imread 后检查 src.empty(),并启用 cv::IMREAD_UNCHANGED 读取时添加 cv::IMREAD_UNCHANGED 标志

Q2: 转换后的灰度图像偏暗

A2: 在 cv::cvtColor 后添加直方图均衡化:

cv::equalizeHist(gray, enhanced);

Q3: 窗口无法显示中文路径

A3: 使用 cv::imread 时将路径转换为 UTF-8 编码,或改用 cv::imdecode

std::vector<uchar> data = ...; // 二进制数据
cv::Mat img = cv::imdecode(data, cv::IMREAD_COLOR);

总结

掌握 C++ Opencv 图像处理 的核心函数组合,可快速构建从图像读取到特征提取的完整处理流程。