• c++图像的边缘检测


    图像的边缘检测

    cv::CannyOpenCV 中用于进行边缘检测的函数,特别是用于检测图像中的边缘。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 范数。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    图像边缘检测案例
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    #include 
    
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

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

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    打开摄像头进行边缘检测

    #include 
    #include 
    #include 
    #include 
    
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

  • 相关阅读:
    运维工程师面试题及答案(网络运维工程师面试题)
    二叉树MFC实现
    线性回归算法之鸢尾花特征分类【机器学习】
    Java实现拼图小游戏(4)—— 打乱图片(含二维数组知识点)
    2023年DDoS攻击暴增170%:美国、中国和印度是重灾区
    四十一、django框架简介
    golang template: “xxx.html“ is an incomplete or empty template 解决方法
    crAPI靶场学习记录
    【Android SDK30版本】代码明显是正确的为何升级了sdk版本号就报错或是警告呢(已解决)
    MySQL初学知识总篇
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133310886