C++ Opencv HoughLines()用霍夫變換在二元圖像中尋線

一、霍夫變換簡介

參考http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm


二、HoughLines()函數詳解

該函數接受的輸入矩陣只能是8位單通道的二值化灰度圖。

三、代碼及結果分享

#include<opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void myHough(Mat src, Mat dst)
{
	vector<Vec2f> lines;//用於儲存參數空間的交點
	HoughLines(src, lines, 1, CV_PI / 180, 120, 0, 0);//針對不同像素的圖片注意調整閾值
	const int alpha = 1000;//alpha取得充分大,保證畫出貫穿整個圖片的直線
	//lines中存儲的是邊緣直線在極座標空間下的rho和theta值,在圖像空間(直角座標系下)只能體現出一個點
	//以該點爲基準,利用theta與斜率之間的關係,找出該直線上的其他兩個點(可能不在圖像上),之後以這兩點畫出直線
	for (size_t i = 0; i < lines.size(); i++)
	{
		float rho = lines[i][0], theta = lines[i][1];
		double cs = cos(theta), sn = sin(theta);
		double x = rho * cs, y = rho * sn;
		Point pt1(cvRound(x + alpha * (-sn)), cvRound(y + alpha * cs));
		Point pt2(cvRound(x - alpha * (-sn)), cvRound(y - alpha * cs));
		line(dst, pt1, pt2, Scalar(0, 0, 255), 1, LINE_AA);
	}
}

int main()
{
	Mat mImage = imread("box.jpg");
	if (mImage.data == 0)
	{
		cerr << "Image reading error !" << endl;
		system("pause");
	}
	namedWindow("The original image", WINDOW_NORMAL);
	imshow("The original image", mImage);

	Mat mMiddle ;
	cvtColor(mImage, mMiddle,  COLOR_BGR2GRAY);//Canny()只接受單通道8位圖像,邊緣檢測前先將圖像轉換爲灰度圖
	Canny(mImage, mMiddle, 50, 150, 3);//邊緣檢測,檢測結果作爲霍夫變換的輸入
	Mat mResult = mImage.clone();
	myHough(mMiddle, mResult);//將結果展示在原圖像上
	namedWindow("The processed image", WINDOW_NORMAL);
	imshow("The processed image", mResult);
	waitKey();
	destroyAllWindows();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章