01-opencv中createTrackBar的使用

最近在看opencv中实现canny边缘检测算子的例子时发现代码中为了改变canny边缘检测算子的低阈值而设置了一个trackbar, 之前对齐不是很了解就研究了一下,下面将代码中用trackbar的一句单拿出来进行分析:

createTrackbar("Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold);
	// "Min Threshold": trackbar的名字
	//window_name: 显示图片的窗口的名字
	//&lowThreshold: trackbar改变的参数的地址
	//max_lowThreshold: trackbar所改变的参数的最大值
	// CannyThreshold: 回调函数,当用户通过trackbar改变参数值时会调用一次此回调函数
	//此回调函数中的参数均为全局变量 故所有地方均可以调用

使用trackbar进行canny边缘检测的结果如下:

01-opencv中createTrackBar的使用_第1张图片

 可以通过改变上图中的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;
}

你可能感兴趣的:(OpenCV,opencv,计算机视觉,人工智能)