OpenCV学习(57)

图像变换(11):综合示例:霍夫变换

          这次的综合示例,我们在 HoughLinesP函数的基础上,为其添加了用于控制其第五个参数阈值 threshold的滚动条,因此可以通过调节滚动条来改变阈值,从而动态地控制霍夫线变换检测的线条多少。
详细注释的程序源代码如下。
 

//-------------【头文件、命名空间部分】--------------
//	描述:包含程序所依赖的头文件和命名空间
//---------------------------------------------------
#include 
#include 
#include 
#include 
using namespace std;
using namespace cv;

//-------------【全局变量声明部分】--------------
//	描述:全局变量声明
//-----------------------------------------------
//定义原始图、中间图、效果图
Mat g_srcImage, g_midImage, g_dstImage;
//定义一个矢量结构g_lines用于存放得到的线段矢量集合
vector g_lines;
//变量接收的TrackBar位置参数
int g_nthreshold = 100;

//-------------【全局函数声明部分】--------------
//	描述:全局函数声明
//-----------------------------------------------
static void on_HoughLines(int, void*);	//回调函数

int main()
{
	cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
	Mat g_srcImage = imread("E:/pictures/2.jpg");
	imshow("【原始图】", g_srcImage);

	//创建滚动条
	namedWindow("【效果图】", WINDOW_AUTOSIZE);
	createTrackbar("值:", "【效果图】", &g_nthreshold, 200, on_HoughLines);

	//边缘检测并进行转化
	Canny(g_srcImage, g_midImage, 50, 200, 3);
	cvtColor(g_midImage, g_dstImage, COLOR_GRAY2BGR);

	//调用一次回调函数,调用一次HoughLinesP函数
	on_HoughLines(g_nthreshold, 0);
	HoughLinesP(g_midImage, g_lines, 1, CV_PI/180, 80, 50, 10);
	
	imshow("【效果图】", g_dstImage);

	waitKey(0);
	return 0;
}

//-------------【on_HoughLines()函数】--------------
//	描述:【顶帽运算/黑帽运算】窗口的回调函数
//---------------------------------------------------
static void on_HoughLines(int, void*)
{
	//定义局部变量储存全局变量
	Mat dstImage = g_dstImage.clone();
	Mat midImage = g_midImage.clone();

	//调用HoughLinesP函数
	vector mylines;
	HoughLinesP(midImage, mylines, 1, CV_PI/180, g_nthreshold + 1, 50, 10);

	//循环遍历并绘制每一条线段
	for (size_t i = 0; i < mylines.size(); i++)
	{
		Vec4i l = mylines[i];
		line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(23, 180, 55), 1, LINE_AA);
	}
	//imshow("【效果图】", dstImage);
}

运行截图:
OpenCV学习(57)_第1张图片

 OpenCV学习(57)_第2张图片

 OpenCV学习(57)_第3张图片

 

你可能感兴趣的:(opencv,学习,人工智能)