c++视觉检测-----Canny边缘算子

Canny边缘算子

cv::Canny()是OpenCV库中用于执行Canny边缘检测的函数。Canny边缘检测是一种广泛使用的图像处理技术,用于检测图像中的边缘。

以下是cv::Canny()函数的一般用法和参数:

void cv::Canny(
    cv::InputArray image,       // 输入图像,通常是灰度图像
    cv::OutputArray edges,      // 输出的边缘图像
    double threshold1,          // 低阈值
    double threshold2,          // 高阈值
    int apertureSize = 3,       // Sobel算子的大小,通常为3
    bool L2gradient = false    // 是否使用L2范数
);
  • image: 输入图像,通常是灰度图像。
  • edges: 输出的边缘图像,边缘像素将被标记为白色,非边缘像素将被标记为黑色。
  • threshold1threshold2: 低阈值和高阈值。这两个阈值用于控制边缘检测的灵敏度。通常,threshold1设置为较低的值,而threshold2设置为较高的值。如果图像梯度幅值高于threshold2,则被认为是强边缘。如果图像梯度幅值介于threshold1threshold2之间,且与强边缘相连,则被认为是弱边缘。
  • apertureSize: Sobel算子的大小,通常为3,表示使用3x3的Sobel核进行梯度计算。
  • L2gradient: 是否使用L2范数计算图像梯度,默认为false。如果设置为true,则使用更精确但计算量更大的L2范数,否则使用默认的L1范数。

cv::Canny()函数通过计算图像的梯度,并根据阈值将像素分为强边缘和弱边缘,最终生成边缘图像。你可以根据具体应用的需求调整阈值和其他参数以获得最佳的边缘检测效果。
以下是一个简单的C++示例,演示如何使用OpenCV的Canny函数来进行边缘检测:

#include <opencv2/opencv.hpp>

int main() {
    // 读取输入图像
    cv::Mat inputImage = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);

    if (inputImage.empty()) {
        std::cerr << "Error: Could not read the input image." << std::endl;
        return -1;
    }

    // 创建输出图像
    cv::Mat edgeImage;

    // 设置Canny边缘检测的参数
    double lowThreshold = 50;  // 低阈值
    double highThreshold = 150; // 高阈值
    int apertureSize = 3;       // Sobel算子的孔径大小
    bool L2gradient = false;    // 是否使用L2范数

    // 应用Canny边缘检测
    cv::Canny(inputImage, edgeImage, lowThreshold, highThreshold, apertureSize, L2gradient);

    // 显示原始图像和边缘图像
    cv::imshow("Original Image", inputImage);
    cv::imshow("Canny Edge Detection", edgeImage);

    cv::waitKey(0);

    return 0;
}

在这里插入图片描述

使用相机实时canny 算子边缘检测

#include <opencv2/opencv.hpp>

cv::Mat inputImage;
cv::Mat edges;

int lowThreshold = 50;
int maxLowThreshold = 200;

void updateCanny(int, void*) {
    cv::Canny(inputImage, edges, lowThreshold, lowThreshold * 3, 3);
    cv::imshow("Canny Edges", edges);
}

int main() {
    cv::VideoCapture cap(0); // 打开本地相机(通常为0)

    if (!cap.isOpened()) {
        std::cerr << "Error: Could not open the camera." << std::endl;
        return -1;
    }

    cv::namedWindow("Canny Edges", cv::WINDOW_NORMAL);

    cv::createTrackbar("Low Threshold", "Canny Edges", &lowThreshold, maxLowThreshold, updateCanny);

    while (true) {
        cap >> inputImage;
        if (inputImage.empty()) {
            break;
        }

        updateCanny(0, 0);

        char key = cv::waitKey(10);
        if (key == 27) { // 按下ESC键退出循环
            break;
        }
    }

    cap.release();
    cv::destroyAllWindows();

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枭玉龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值