#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
/// 全局变量
Mat src, src_gray;
Mat dst, detected_edges;
int edgeThresh = 1;
int lowThreshold;
int const max_lowThreshold = 100;
int ratio = 3;
int kernel_size = 3;
char* window_name = "Edge Map";
/**
* @函数 CannyThreshold
* @简介: trackbar 交互回调 - Canny阈值输入比例1:3
*/
void CannyThreshold(int, void*)
{
/// 使用 3x3内核降噪
blur(src_gray, detected_edges, Size(3, 3));
/// 运行Canny算子
/*
Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
输入参数:
detected_edges: 原灰度图像
detected_edges: 输出图像 (支持原地计算,可为输入图像)
lowThreshold: 用户通过 trackbar设定的值。
highThreshold: 设定为低阈值的3倍 (根据Canny算法的推荐)
kernel_size: 设定为 3 (Sobel内核大小,内部使用)
*/
Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
imshow("1",detected_edges);
/// 使用 Canny算子输出边缘作为掩码显示原图像
dst = Scalar::all(0);//填充 dst 图像,填充值为0 (图像全黑).
src.copyTo(dst, detected_edges);//使用函数 copyTo 标识被检测到的边缘部分 (背景为黑色).
imshow(window_name, dst);
}
/** @函数 main */
int main(int argc, char** argv)
{
/// 装载图像
src = imread("C:/Users/dell/Desktop/2.jpg");
if (!src.data)
{
return -1;
}
/// 创建与src同类型和大小的矩阵(dst)
dst.create(src.size(), src.type());
/// 原图像转换为灰度图像
cvtColor(src, src_gray, CV_BGR2GRAY);
/// 创建显示窗口
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
/// 创建trackbar
/*
createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );
注意:
通过trackbar控制的变量为 lowThreshold ,上限为 max_lowThreshold (我们已经设定为100)
每次用户通过trackbar产生变动,回调函数 CannyThreshold 被调用.
*/
createTrackbar("Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold);
/// 显示图像
CannyThreshold(0, 0);
/// 等待用户反应
waitKey(0);
return 0;
}