寻门OpenCV-03-Canny边缘检测算法(带滑动条控制)

Canny算法是进行边缘检测的一种实用的算法,具体实现方法如下。在本程序中设置了滑动条可以改变高低阈值。

#include <opencv2/opencv.hpp>
#include <opencv/highgui.h>

using namespace cv;
using namespace std;
//Canny边缘检测
//实现用滑动条改变高、低阈值

const int sliderHigh_max = 20;//设置高阈值的最大值
const int sliderLow_max = 10;//设置低阈值的最大值
int sliderHigh;
int sliderLow;

Mat pic, grayPic, edge;

void trackbar(int, void*)
{
    Canny(edge, edge, sliderLow, sliderHigh, 3);
    imshow("Canny边缘提取", edge);
}
int main()
{
    pic = imread("..\\picture\\lena.jpg");
    imshow("原始图像",pic);
    cvtColor(pic, grayPic, COLOR_BGR2GRAY);//将原始图像转化为灰度图
    blur(grayPic, edge, Size(3, 3));//使用blur进行滤波
    sliderHigh = 0;
    sliderLow = 0;
    namedWindow("Canny边缘提取", 1);
    createTrackbar("CannyLow", "Canny边缘提取", &sliderLow, sliderLow_max, trackbar);//设置低阈值
    createTrackbar("CannyHigh", "Canny边缘提取", &sliderHigh, sliderHigh_max, trackbar);//设置高阈值
    trackbar(sliderLow, 0);
    trackbar(sliderHigh, 0);
    waitKey(0);
}

Canny()的详细函数解释如下:

void Canny(
                InputArray image,
                OutputArray edges, 
                double threshold1, 
                double threshold2, 
                int apertureSize=3,
                bool L2gradient=false
           )
  • InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。
  • OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和类型。
  • double类型的threshold1,第一个滞后性阈值【低阈值】。值越大,找到的边缘越少
  • double类型的threshold2,第二个滞后性阈值【高阈值】。
  • int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。
  • bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。

猜你喜欢

转载自www.cnblogs.com/findsnow/p/11838940.html