1. 程式人生 > >HoughLines()函式 畫直線在影象上

HoughLines()函式 畫直線在影象上

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main( )
{
	//【1】載入原始圖和Mat變數定義   
	Mat srcImage = imread("C://1.jpg");  //工程目錄下應該有一張名為1.jpg的素材圖
	Mat midImage,dstImage;//臨時變數和目標圖的定義

	//【2】進行邊緣檢測和轉化為灰度圖
	Canny(srcImage, midImage, 50, 200, 3);//進行一此canny邊緣檢測
	cvtColor(midImage,dstImage, CV_GRAY2BGR);//轉化邊緣檢測後的圖為灰度圖

	//【3】進行霍夫線變換
	vector<Vec2f> lines;//定義一個向量結構lines用於存放得到的線段向量集合
	HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );
	//【4】依次在圖中繪製出每條線段
	for( size_t i = 0; i < lines.size(); i++ )
	{
		float rho = lines[i][0], theta = lines[i][1];
		Point pt1, pt2;
		double a = cos(theta), b = sin(theta);
		double x0 = a*rho, y0 = b*rho;
		pt1.x = cvRound(x0 + 1000*(-b));
		pt1.y = cvRound(y0 + 1000*(a));
		pt2.x = cvRound(x0 - 1000*(-b));
		pt2.y = cvRound(y0 - 1000*(a));
		//此句程式碼的OpenCV2版為:
		//line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);
		//此句程式碼的OpenCV3版為:
		line( dstImage, pt1, pt2, Scalar(0,0,255), 1,CV_AA);
	}

	//【5】顯示原始圖  
	imshow("【原始圖】", srcImage);  

	//【6】邊緣檢測後的圖 
	imshow("【邊緣檢測後的圖】", midImage);  

	//【7】顯示效果圖  
	imshow("【效果圖】", dstImage);  

	waitKey(0);  

	return 0;  
}

程式碼如上 分別用兩張不同型別的照片進行測試,執行結果如下: 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 上圖可以看出了,只能檢測到直線型別的線條!下圖可見,可以檢測到直線線條! 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述