最近在看opencv中实现canny边缘检测算子的例子时发现代码中为了改变canny边缘检测算子的低阈值而设置了一个trackbar, 之前对齐不是很了解就研究了一下,下面将代码中用trackbar的一句单拿出来进行分析:
聂拉木ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!createTrackbar("Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold);
// "Min Threshold": trackbar的名字
//window_name: 显示图片的窗口的名字
//&lowThreshold: trackbar改变的参数的地址
//max_lowThreshold: trackbar所改变的参数的大值
// CannyThreshold: 回调函数,当用户通过trackbar改变参数值时会调用一次此回调函数
//此回调函数中的参数均为全局变量 故所有地方均可以调用
使用trackbar进行canny边缘检测的结果如下:
可以通过改变上图中的trackbar的参数动态的调整边缘检测结果。本质就是人每修改一次结果,trackbar函数就会动态的调用一次边缘检测结果并重新显示,基于opencv的完整代码如下:
#include#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
//using namespace std;
using namespace cv;
Mat input,src, src_gray;
Mat dst, detected_edges;
int lowThreshold = 0;
const int max_lowThreshold = 100;
const int ratio = 3;
const int kernel_size = 3;
//const int max_kernel_size = 9;
const char* window_name = "Edge Map";
static void CannyThreshold(int, void*)
{
blur(src_gray, detected_edges, Size(3, 3));
Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
dst = Scalar::all(0);
src.copyTo(dst, detected_edges);
imshow(window_name, dst);
imshow("src", src);
}
int main()
{
const char* input_path = "E:/ImageProcessing_C++/imgs/indoor.jpg";
Mat input = imread(input_path, IMREAD_COLOR); // Load an image
Size s = input.size();
Mat image(0.3*s.height, 0.3*s.width, CV_8UC1);
cv::resize(input, image, image.size());
src = image.clone();
if (src.empty())
{
std::cout<< "Could not open or find the image!\n"<< std::endl;
return -1;
}
dst.create(src.size(), src.type());
cvtColor(src, src_gray, COLOR_BGR2GRAY);
namedWindow(window_name, WINDOW_AUTOSIZE);
createTrackbar("Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold);
// "Min Threshold": trackbar的名字
//window_name: 显示图片的窗口的名字
//&lowThreshold: trackbar改变的参数的地址
//max_lowThreshold: trackbar所改变的参数的大值
// CannyThreshold: 回调函数,当用户通过trackbar改变参数值时会调用一次此回调函数
//此回调函数中的参数均为全局变量 故所有地方均可以调用
CannyThreshold(0, 0);
waitKey(0);
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧