1. 程式人生 > >控制閥值的霍夫變換 檢測線條

控制閥值的霍夫變換 檢測線條

該樣例可以通過改變影象上的閥值滑動條,生成不同閥值下的影象! 發現閥值在30多的時候,畫的線條是最多的,最大的閥值200和最小的閥值不一定是畫線條數最多的!

程式碼如下:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
//-----------------------------------【全域性變數宣告部分】--------------------------------------
//		描述:全域性變數宣告
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_dstImage,g_midImage;//原始圖、中間圖和效果圖
vector<Vec4i> 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<Vec4i> 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);
}

測試效果圖: 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述