c++图像的边缘检测

图像的边缘检测

cv::Canny 是 OpenCV 中用于进行边缘检测的函数,特别是用于检测图像中的边缘。Canny 边缘检测是一种广泛使用的技术,它能够识别图像中的边缘,这些边缘通常表示对象之间的边界或图像中的显著特征

void cv::Canny(const cv::Mat& image, cv::Mat& edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false);



参数说明:

    image:输入图像,需要进行边缘检测的图像,通常是灰度图像。
    edges:输出图像,用于存储检测到的边缘。
    threshold1:第一个阈值,用于边缘检测的强度梯度。
    threshold2:第二个阈值,用于连接边缘的弱边缘梯度。
    apertureSize:(可选)Sobel 算子的核大小,默认为3。
    L2gradient:(可选)一个布尔值,指定是否使用更精确但计算量更大的 L2 范数来计算梯度幅度,默认为false,通常使用 L1 范数。
图像边缘检测案例
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat inputImage = cv::imread("1.png", cv::IMREAD_GRAYSCALE);//先把图像改成灰色图才能进行边缘的处理

    // 检查图像是否成功加载
    if (inputImage.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 创建一个输出图像
    cv::Mat edges;

    // 使用Canny边缘检测
    double lowThreshold = 50; // 低阈值
    double highThreshold = 150; // 高阈值
    int apertureSize = 3; // Sobel算子内核大小
    cv::Canny(inputImage, edges, lowThreshold, highThreshold, apertureSize);//

    // 显示原始图像和边缘检测结果
    cv::imshow("原始图像", inputImage);
    cv::imshow("边缘检测结果", edges);

    // 等待用户按下键盘任意键后关闭窗口
    cv::waitKey(0);

    return 0;
}

在这里插入图片描述

使用3×3的内核进行降噪再进行边缘检测案例

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
int main() {
    // 读取图像
    cv::Mat srcImage = cv::imread("1.jpg");//先把图像改成灰色图才能进行边缘的处理

    imshow("【原始图】Canny边缘检测", srcImage);
    Mat dstImage, edge, grayImage; //参数定义
    //【1】创建与 src同类型和大小的矩阵(dst)
    dstImage.create(srcImage.size(), srcImage.type());
        //【2】将原图像转换为灰度图像
        //此句代码的OpenCV2版为:
        //cvtColor( srcImage, grayImage, CV_BGR2GRAY )
        //此句代码的 OpenCV3版为:
    cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
            //【3】先使用 3×3内核来降噪
            blur(grayImage, edge, Size(3, 3));
    //【4】运行Canny算子
    Canny(edge, edge, 3, 9, 3);
    //【5】显示效果图
    imshow("【效果图】Canny边缘检测", edge);
    waitKey(0);
    return 0;
}

在这里插入图片描述

打开摄像头进行边缘检测

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;


int main()
{
	//从摄像头读入视频
	VideoCapture capture(0);
	Mat edges;
	//循环显示每一帧
	while (1)
	{
		//【1】读入图像
		Mat frame;//定义一个 Mat变量,用于存储每一帧的图像
		capture >> frame; //读取当前帧
		//【2】将原图像转换为灰度图像
		cvtColor(frame, edges, CV_BGR2GRAY);//转化 BGR彩色图为灰度图
		//【3】使用 3x3内核来降噪(2x3+1=7)
		blur(edges, edges, Size(7, 7));//进行模糊
		//【4】进行canny边缘检测并显示
		Canny(edges, edges, 0, 30, 3);
		imshow("被 canny后的视频", edges);//显示经过处理后的当前帧
		if (waitKey(30) >= 0) break;//延时30ms
	}
	return 0;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

枭玉龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值