国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

霍夫變換直線檢測算法實現(xiàn)OpenCV(C++)

這篇具有很好參考價值的文章主要介紹了霍夫變換直線檢測算法實現(xiàn)OpenCV(C++)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、原理
對于霍夫變換的原理這里就不進行描述啦,感興趣的可以自行搜索。也可以看知乎上面的這篇貼文通俗易懂理解——霍夫變換原理。
二、算法代碼

/*
*參數(shù)說明:
*src:待檢測的原圖像
*rho:以像素為單位的距離分辨率,即距離r離散時的單位長度
*theat:以角度為單位的距離分辨率,即角度Θ離散時的單位長度
*Threshold:累加器閾值,參數(shù)空間中離散化后每個方格被通過的
           累計次數(shù)大于該閾值,則該方格代表的直線被視為在
		   原圖像中存在
*lines:檢測到的直線極坐標描述的系數(shù)數(shù)組,每條直線由兩個參
       數(shù)表示,分別為直線到原點的距離r和原點到直線的垂線與
	   x軸的夾角Θ 
*/
void myHoughLines(Mat &src,double rho,double theat,int Threshold,vector<Vec2f> &lines)
{
	if (src.empty()|| rho<0.1 || theat>360|| theat<0)
		return ;

	int row = src.rows;
	int col = src.cols;
	Mat gray;
	if (src.channels() > 1)
	{//灰度化
		cvtColor(src, gray, COLOR_BGR2GRAY);
	}
	else
		src.copyTo(gray);

	int maxDistance = sqrt(src.cols*src.cols + src.rows*src.rows);
	int houghMat_cols = 360 / theat;//霍夫變換后距離夾角坐標下對應(yīng)的Mat的寬
	int houghMat_rows = maxDistance / rho;//霍夫坐標距離夾角下對應(yīng)的Mat的高
	Mat houghMat = Mat::zeros(houghMat_rows, houghMat_cols, CV_32FC1);

	//邊緣檢測
	Canny(gray, gray, 100, 200, 3);

	//二值化
	threshold(gray, gray, 160, 255, THRESH_BINARY);

	//遍歷二值化后的圖像
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < col;j++)
		{
			if (gray.ptr<uchar>(i)[j] != 0)
			{
				/*從0到360度遍歷角度,得到一組關(guān)于距離夾角的離散點,即得到
				一組關(guān)于經(jīng)過當(dāng)前點(i,j)按單位角度theat旋轉(zhuǎn)得到的直線*/
				for (int k = 0;k < 360/ theat;k += theat)
				{
					double r = i*sin(k*CV_PI / 180) + j*cos(k*CV_PI / 180);
					if (r >= 0)
					{//直線到原點的距離必須大于0
						//獲得在霍夫變換距離夾角坐標系下對應(yīng)的Mat的行的下標
						int r_subscript = r / rho;
						
						//經(jīng)過該直線的點數(shù)加1
						houghMat.at<float>(r_subscript,k)= houghMat.at<float>(r_subscript, k)+1;
					}
					
				}
			}
		}
	}
	
	//經(jīng)過直線的點數(shù)大于閾值,則視為在原圖中存在該直線
	for (int i = 0;i < houghMat_rows;i++)
	{
		for (int j = 0;j < houghMat_cols;j++)
		{
			if (houghMat.ptr<float>(i)[j] > Threshold)
			{
				//line保存直線到原點的距離和直線到坐標原點的垂線和x軸的夾角
				Vec2f line(i*rho,j*theat*CV_PI/180);
				lines.push_back(line);
			}
		}
	}
	
}

三、效果測試
測試代碼

void drawLine(Mat &img, vector<Vec2f> lines, double rows, double cols, Scalar scalar, int n)
{
	Point pt1, pt2;
	for (int i = 0;i < lines.size();i++)
	{
		float rho = lines[i][0];//直線到坐標原點的距離
		float theat = lines[i][1];//直線到坐標原點的垂線和x軸的夾角
		double a = cos(theat);
		double b = sin(theat);
		double x0 = a*rho, y0 = b*rho;//直線與過坐標原點的垂線的交點
		double length = max(rows, cols);//突出高寬的最大值
		
		//計算直線上的一點
		pt1.x = cvRound(x0 + length*(-b));
		pt1.y = cvRound(y0 + length*(a));
		//計算直線上的另一點
		pt2.x = cvRound(x0 - length*(-b));
		pt2.y = cvRound(y0 - length*(a));
		while (pt1.x == pt2.x&&pt1.y == pt2.y)
		{
			//計算直線上的另一點
			pt2.x = cvRound(x0 + length*(-b));
			pt2.y = cvRound(y0 + length*(a));
		}
		//兩點繪制直線
		line(img, pt1, pt2, scalar, n);
	}
}

int main()
{
	//Mat test = imread("../d.png");
    Mat test = imread("../HoughLines.jpg");
	vector<Vec2f> lines;
	myHoughLines(test,1,1,100,lines);
	for (int i = 0;i < lines.size();i++)
	{
		cout << "直線為:" << endl << lines[i] << endl;
	}
	Mat testResult = Mat::zeros(test.size(),CV_8U);//在全黑的圖像中畫出直線
	//test.copyTo(testResult);//在原圖上畫出直線

	drawLine(testResult, lines, test.rows, test.cols, Scalar(255),1);
	imshow("原圖:", test);
	imshow("變換后的直線:", testResult);
	waitKey(0);
	return 0;
}

上述代碼中的drawLine()函數(shù)是《OpenCV4快速入門》一書的代碼清單 7-2中的原函數(shù),只用于畫線。
測試原圖
霍夫直線檢測c++實現(xiàn),OpenCV,算法,算法,c++,計算機視覺
測試效果
霍夫直線檢測c++實現(xiàn),OpenCV,算法,算法,c++,計算機視覺
該算法代碼的解析在代碼的注釋中已經(jīng)寫明,對函數(shù)參數(shù)也進行了說明。我使用了多張圖片進行了測試,以及多次調(diào)整參數(shù)進行測試,發(fā)現(xiàn)在rho=1,theat=1,Threshold=100時的檢測效果可以達到最佳。文章來源地址http://www.zghlxwxcb.cn/news/detail-745083.html

到了這里,關(guān)于霍夫變換直線檢測算法實現(xiàn)OpenCV(C++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【OpenCV】cv2.HoughLines()霍夫直線檢測

    【OpenCV】cv2.HoughLines()霍夫直線檢測

    霍夫直線檢測(Hough Line Transform)是一種在圖像中檢測直線的經(jīng)典算法。它通過將二維圖像空間中的點映射到極坐標空間中,將直線檢測問題轉(zhuǎn)化為在參數(shù)空間中找到交點的問題。 原理: 對于圖像空間中的每個邊緣點,計算其對應(yīng)在極坐標空間中可能的直線。 極坐標空間中

    2024年02月05日
    瀏覽(94)
  • OpenCV——霍夫變換圓檢測

    OpenCV——霍夫變換圓檢測

    ? ? HoughCircles 該函數(shù)使用霍夫變換在灰度圖像中查找圓。 image :輸入圖像,需要為 8 位的灰度單通道圖像。 circle :找到的圓的輸出向量。每個向量被編碼為3或4個元素的浮點型向量 ( x , y , r a d i u s ) (x, y, radius) ( x , y , r a d i u s ) 或 ( x , y , r a d i u s , v o t e s ) (x, y, radius,

    2024年02月13日
    瀏覽(23)
  • OpenCV | 霍夫變換:以車道線檢測為例

    OpenCV | 霍夫變換:以車道線檢測為例

    霍夫變換 霍夫變換只能灰度圖,彩色圖會報錯 lines = cv2.HoughLinesP(edge_img,1,np.pi/180,15,minLineLength=40,maxLineGap=20) 參數(shù)1:要檢測的圖片矩陣 參數(shù)2:距離r的精度,值越大,考慮越多的線 參數(shù)3:距離theta的精度,值越大,考慮越多的線 參數(shù)4:累加數(shù)閾值,值越小,考慮越多的線

    2024年02月04日
    瀏覽(26)
  • OpenCV26HoughCircles 霍夫圓變換原理及圓檢測

    OpenCV26HoughCircles 霍夫圓變換原理及圓檢測

    霍夫圓變換的基本原理與霍夫線變換大體類似 對直線來說,一條直線能由極徑極角(r,θ)表示,而對于圓來說,我們需要三個參數(shù):圓心(a,b),半徑 r 笛卡爾坐標系中圓的方程為: (x-a)2 + (y-b)2 = r2 化簡便可得到: a = x - r·cosθ b = y - r·sinθ 對于(x0,y0),我們可以將通

    2024年02月03日
    瀏覽(22)
  • OpenCV中的圖像處理 —— 霍夫線 / 圈變換 + 圖像分割(分水嶺算法) + 交互式前景提?。℅rabCut算法)

    OpenCV中的圖像處理 —— 霍夫線 / 圈變換 + 圖像分割(分水嶺算法) + 交互式前景提取(GrabCut算法)

    ??上一節(jié)我們介紹了OpenCV中傅里葉變換和模板匹配,這一部分我們來聊一聊霍夫線/圈變換的原理和應(yīng)用、使用分水嶺算法實現(xiàn)圖像分割和使用GrabCut算法實現(xiàn)交互式前景提取 ??哈嘍大家好,這里是ErrorError!,一枚某高校大二本科在讀的♂同學(xué),希望未來在機器視覺領(lǐng)域能夠有

    2023年04月08日
    瀏覽(31)
  • OPENCV C++(七)霍夫線檢測+找出輪廓和外接矩形+改進旋轉(zhuǎn)

    霍夫線檢測 ?定義存放輸出線的向量 此向量輸出有距離,角度 因為檢測的原理就是在變換霍夫空間里面去檢測的,這里可以理解為極坐標 第3個參數(shù)是距離精度 第四個參數(shù)是角度精度,第五個是閾值,只有點超過90個才算一條線 在圖中畫線操作: 這里是畫線操作? 概率霍夫

    2024年02月13日
    瀏覽(91)
  • OpenCV如何實現(xiàn)直線檢測

    OpenCV如何實現(xiàn)直線檢測

    本文主要介紹OpenCV自帶的直線檢測函數(shù)HoughLines()的用法,這個函數(shù)的第一個參數(shù)是一個二值化圖像,所以在進行霍夫變換之前要首先進行二值化,或者進行Canny 邊緣檢測。第二和第三個值分別代表beta; 和 theta; 的精確度。第四個參數(shù)是閾值,只有累加其中的值高于閾值時才被

    2024年02月14日
    瀏覽(21)
  • 【矩陣檢測】Hough霍夫變換矩陣檢測【含Matlab源碼 3563期】

    【矩陣檢測】Hough霍夫變換矩陣檢測【含Matlab源碼 3563期】

    獲取代碼方式1: 完整代碼已上傳我的資源:【矩陣檢測】基于matlab Hough霍夫變換矩陣檢測【含Matlab源碼 3563期】 點擊上面藍色字體,直接付費下載,即可。 獲取代碼方式2: 付費專欄Matlab圖像處理(初級版) 備注: 點擊上面藍色字體 付費專欄Matlab圖像處理(初級版) ,掃

    2024年02月04日
    瀏覽(18)
  • 【計算機圖形學(xué)】圖形變換(以任意直線為對稱軸的對稱變換)

    【計算機圖形學(xué)】圖形變換(以任意直線為對稱軸的對稱變換)

    模塊3-2 圖形變換 一 實驗?zāi)康?編寫圖形各種變換的算法 二 實驗內(nèi)容 1 :任意直線的對稱變換。要求將變換矩陣寫在實驗報告中,并與代碼匹配。求對任意直線Ax+By+C=0的對稱變換矩陣。 實驗結(jié)果如下圖所示: 1:預(yù)設(shè)圖形初始化 2:鼠標左鍵點擊直線起點 3:鼠標右鍵點擊直線

    2024年02月01日
    瀏覽(55)
  • Python-OpenCV中的圖像處理-霍夫變換

    Python-OpenCV中的圖像處理-霍夫變換

    霍夫(Hough)變換在檢測各種形狀的技術(shù)中非常流行,如果要檢測的形狀可以用數(shù)學(xué)表達式描述,就可以是使用霍夫變換檢測它。即使要檢測的形狀存在一點破壞或者扭曲也是可以使用。 Hough直線變換,可以檢測一張圖像中的直線 cv2.HoughLines(image, rho, theta, threshold) return:返回值

    2024年02月13日
    瀏覽(124)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包