边缘检测——Canny 算法入门

知识库
知识库文档
/tech-stacks/opencv/examples/边缘检测——Canny 算法入门.md

文档

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:3
  • cv::waitKey(0) 等待按键,0 表示无限等待

信息

路径
/tech-stacks/opencv/examples/边缘检测——Canny 算法入门.md
更新时间
2026/5/30