控制阀值的霍夫变换 检测线条

该样例可以通过改变图像上的阀值滑动条,生成不同阀值下的图像!
发现阀值在30多的时候,画的线条是最多的,最大的阀值200和最小的阀值不一定是画线条数最多的!

代码如下:

#include 
#include 
#include 
using namespace std;
using namespace cv;
//-----------------------------------【全局变量声明部分】--------------------------------------
//		描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_dstImage,g_midImage;//原始图、中间图和效果图
vector g_lines;//定义一个矢量结构g_lines用于存放得到的线段矢量集合
//变量接收的TrackBar位置参数
int g_nthreshold=100;
static void on_HoughLines(int, void*);//回调函数
int main( )
{
	
	//载入原始图和Mat变量定义   
	Mat g_srcImage = imread("C://1.jpg");  //工程目录下应该有一张名为1.jpg的素材图

	//显示原始图  
	imshow("【原始图】", g_srcImage);  

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

	//进行边缘检测和转化为灰度图
	Canny(g_srcImage, g_midImage, 50, 200, 3);//进行一次canny边缘检测
	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(255,0,0), 1, CV_AA);
	}
	//显示图像
	imshow("【效果图】",dstImage);
}

测试效果图:
控制阀值的霍夫变换 检测线条_第1张图片
控制阀值的霍夫变换 检测线条_第2张图片
控制阀值的霍夫变换 检测线条_第3张图片
控制阀值的霍夫变换 检测线条_第4张图片
控制阀值的霍夫变换 检测线条_第5张图片

你可能感兴趣的:(opencv)