文档
OpenCV 图像处理入门——边缘检测与显示
目标
使用 OpenCV C++ 读取图片、高斯模糊 + Canny 边缘检测,并用窗口显示原图和结果。
完整代码
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
int main(int argc, char** argv) {
// 1. 读取图像(支持命令行参数或默认测试图)
cv::Mat src;
if (argc > 1) {
src = cv::imread(argv[1], cv::IMREAD_COLOR);
} else {
// 没有传入图片时生成一张渐变色测试图
src = cv::Mat(480, 640, CV_8UC3);
for (int y = 0; y < src.rows; y++) {
for (int x = 0; x < src.cols; x++) {
src.at<cv::Vec3b>(y, x) = cv::Vec3b(
(uchar)(y * 255 / src.rows), // B
(uchar)(x * 255 / src.cols), // G
(uchar)((x + y) * 255 / (src.rows + src.cols)) // R
);
}
}
}
if (src.empty()) {
std::cerr << "无法读取图像!" << std::endl;
return -1;
}
std::cout << "图像尺寸: " << src.cols << "x" << src.rows
<< ", 通道数: " << src.channels() << std::endl;
// 2. 灰度转换
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
// 3. 高斯模糊(去噪)
cv::Mat blurred;
cv::GaussianBlur(gray, blurred, cv::Size(5, 5), 1.4);
// 4. Canny 边缘检测
cv::Mat edges;
cv::Canny(blurred, edges, 50, 150);
// 5. 显示结果
cv::namedWindow("原图", cv::WINDOW_NORMAL);
cv::namedWindow("边缘检测", cv::WINDOW_NORMAL);
cv::resizeWindow("原图", 640, 480);
cv::resizeWindow("边缘检测", 640, 480);
cv::imshow("原图", src);
cv::imshow("边缘检测", edges);
std::cout << "按任意键退出..." << std::endl;
cv::waitKey(0);
// 6. 保存结果
cv::imwrite("edges_output.jpg", edges);
std::cout << "边缘图已保存为 edges_output.jpg" << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(EdgeDetector LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(OpenCV REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})
运行步骤
mkdir build && cd build
cmake ..
make -j$(nproc)
# 使用自定义图片
./EdgeDetector /path/to/photo.jpg
# 或直接运行(使用内置渐变色图)
./EdgeDetector
关键点
cv::imread()读取图像,返回cv::Mat矩阵cv::cvtColor()色彩空间转换,边缘检测需灰度图cv::GaussianBlur()去噪,Canny 对噪声敏感cv::Canny(blurred, edges, low, high)双阈值法,low:high 推荐 1:3cv::waitKey(0)等待按键,0 表示无限等待