• Canny,先Scharr得梯度再Canny,三通道黑色背景展示结果(OpenCV案例源码edge.cpp解读)


    有所更改,参数不求完备,但求实用。源码参考D:sourceopencv-3.4.9samplescppedge.cpp

    #include<opencv2opencv.hpp>
    #include<iostream>
    
    using namespace cv;
    using namespace std;
    
    int edgeThresh = 1;
    int edgeThreshScharr = 1;
    
    Mat image, gray, blurImage, edge1, edge2, cedge;
    
    const string window_name1 = "Edge map : Canny default (Sobel gradient)";
    const string window_name2 = "Edge map : Canny with custom gradient (Scharr)";
    
    static void onTrackbar(int, void*) //滑动条的响应函数,格式必须这样
    {
        blur(gray, blurImage, Size(3, 3)); //均值滤波
        //直接用Canny
        Canny(blurImage, edge1, edgeThresh, edgeThresh * 3); //图,结果图(二值图),低阈值,高阈值
        
        cedge = Scalar::all(0); //刷新黑色背景
        image.copyTo(cedge, edge1); //image与二值图edge1得到的彩色边缘图,赋值给cedge(三通道黑色矩阵)
        imshow(window_name1, cedge);
        imshow("edge", edge1);
        /// 先用Scharr得到x、y方向的梯度图(灰度图),再用Canny
        Mat dx, dy;
        Scharr(blurImage, dx, CV_16S, 1, 0); //输入图,结果图,颜色深度(16位),x方向梯度(差分阶数),y方向梯度(差分阶数)
        Scharr(blurImage, dy, CV_16S, 0, 1);
        Canny(dx, dy, edge2, edgeThreshScharr, edgeThreshScharr * 3);//x方向输入图(必须16位),y方向输入图,输出图(8位单通道二值图),低阈值,高阈值
    
        cedge = Scalar::all(0);
        image.copyTo(cedge, edge2);//image与二值图edge1得到的彩色边缘图,赋值给cedge(三通道黑色矩阵)
        imshow(window_name2, cedge);
    
        //Scharr(blurImage, dx, CV_8U, 1, 0);
        //imshow("x", dx); //x梯度方向灰度图(突出竖条)
        //Scharr(blurImage, dy, CV_8U, 0, 1);
        //imshow("y", dy); //y梯度方向灰度图(突出横条)
    }
    
    int main()
    {
        image = imread("D:/lena.jpg");
        cedge.create(image.size(), image.type()); //创建与image等大同类型的模板(矩阵)
        //cedge = Scalar::all(0); //矩阵赋值为0,即黑色模板。(注意放到响应函数中执行,每次刷新背景)
    
        cvtColor(image, gray, COLOR_BGR2GRAY);
    
        // Create a window
        namedWindow(window_name1, 1); //先创建窗体,再创建滑动条
        namedWindow(window_name2, 1);
    
        // create a toolbar
        createTrackbar("Canny threshold default", window_name1, &edgeThresh, 100, onTrackbar); //滑动条标签,窗体,起始,终止,响应函数
        createTrackbar("Canny threshold Scharr", window_name2, &edgeThreshScharr, 400, onTrackbar);
    
        // Show the image
        onTrackbar(0, 0); //执行一次响应函数,格式必须这样
    
        waitKey(0);
        return 0;
    }
  • 相关阅读:
    (16)JavaScript的流程控制(js的循环)
    (15)javaScript入门
    (14)定位布局(子级在父级中自由定位 父级在页面中自由定位)
    (0-1)CSS 标签语法的属性
    ACM/ICPC 之 双向链表_构造列表-模拟祖玛 (TSH OJ-Zuma(祖玛))
    手记-数学分析(高等数学)中有关算法效率的公式列举(O,Θ,Ω)
    2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)
    整数划分问题-解法汇总(暂有DP-递归)
    2014北大研究生推免机试(校内)-垃圾炸弹(基础枚举)
    ACM/ICPC 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)
  • 原文地址:https://www.cnblogs.com/xixixing/p/12330576.html
Copyright © 2020-2023  润新知