日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解

發布時間:2024/5/14 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了更好地看懂本文,大家可以先看下我寫的另一篇博文,鏈接如下:
https://blog.csdn.net/wenhao_ir/article/details/51774444

OpenCV的霍夫變換線檢測函數HoughLines()是利用極坐標下的參數ρ和θ值來表示直線的,我們在實際應用中往往要根據直線的參數ρ和θ值來繪制出直線,那么怎么繪制呢?
在OpenCV中繪制直線的函數為函數line(),它的原型如下:

void cv::line ( InputOutputArray img,Point pt1,Point pt2,const Scalar & color,int thickness = 1,int lineType = LINE_8,int shift = 0 )

從這個原型中,我們可以看出,如果要使用這個函數繪制線條,那么需要知道線條的兩個端點,即參數中的pt1和pt2,所以問題就轉化為根據參數ρ和θ值計算要繪制直線的兩個端點。
在進行計算前,我們先要搞清楚利用函數HoughLines()得到的θ到底是哪個角的度數。
當直線為水平或垂直時θ的值分別為π/2(即90度)和0(即0度),這個在官方文檔中已經說得很清楚了。如下面的截圖所示:

至于其它的情況,我們用兩幅圖來試驗證一下就知道了。
情況一的圖片如下:

情況二的圖片如下:

檢測圖中兩條直線的代碼如下:

//博主微信/QQ 2487872782 //有問題可以聯系博主交流 //有圖像處理需求也可聯系博主 //圖像處理技術交流QQ群 271891601//OpenCV版本:3.0 //VS版本:2012#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include<opencv2/imgcodecs/imgcodecs.hpp> #include <opencv2/imgproc/imgproc.hpp>#include <iostream>using namespace cv; using namespace std;#define HOUGH_VOTE 100int main() {cv::Mat srcImg1 = cv::imread("F:/material/images/P0041-HoughLines-angle-01.bmp", 0);//讀取原圖像并同時轉換為灰度圖if (!srcImg1.data) {cout<<"error load image"<<endl;return -1;}vector<Vec2f> lines;float pi180 = (float)CV_PI / 180;HoughLines(srcImg1, lines, 1, pi180, HOUGH_VOTE, 0, 0);int numLines = lines.size();for (int l = 0; l<numLines; l++){float theta = lines[l][1];cout <<"檢測到的第"<< l+1<<"條線的角度為"<<":" << theta* 180 / CV_PI<< endl;}waitKey(0);return 0;}

兩幅圖的檢測結果如下:

這里說明一下為什么檢測到多條直線,這是因為我們的直線是有寬度的,所以檢測到了多條。
從這個運行結果我們可以看出兩種情況下哪個角是θ。如下面兩幅圖所示:

情況二:

知道了哪個角是θ,我們再把其它已知量和待求點及一些輔助線標注在圖上,如下面兩幅圖所示:

圖中的r就是
由以上幾何關系并結合三角函數的和差公式:

不難得到在兩種情況下都有pt1的坐標為:
p t 1. x = x 0 ? L s i n ( θ ) = x 0 + ( ? L s i n ( θ ) ) pt1.x = x0-Lsin(θ)=x0+(-Lsin(θ)) pt1.x=x0?Lsin(θ)=x0+(?Lsin(θ))
p t 1. y = y 0 + L c o s ( θ ) pt1.y = y0+Lcos(θ) pt1.y=y0+Lcos(θ)
兩種情況下都有pt2的坐標為:
p t 2. x = x 0 + L s i n ( θ ) = x 0 ? ( ? L s i n ( θ ) ) pt2.x = x0+Lsin(θ)=x0-(-Lsin(θ)) pt2.x=x0+Lsin(θ)=x0?(?Lsin(θ))
p t 2. y = y 0 ? L c o s ( θ ) pt2.y = y0-Lcos(θ) pt2.y=y0?Lcos(θ)
其中
x 0 = ρ c o s ( θ ) x0=ρcos(θ) x0=ρcos(θ)
y 0 = ρ s i n ( θ ) y0=ρsin(θ) y0=ρsin(θ)
有了以上計算公式后,我們便可以根據得到的ρ和θ值計算出pt1和pt2的坐標,進而繪制出直線。
相關代碼如下:

HoughLines(magImg, lines, 1, pi180, HOUGH_VOTE, 0, 0);int numLines = lines.size();int L = 1000;for (int l = 0; l<numLines; l++){float rho = lines[l][0], theta = lines[l][1];Point pt1, pt2;double a = cos(theta), b = sin(theta);double x0 = a*rho, y0 = b*rho;pt1.x = cvRound(x0 + L * (-b));pt1.y = cvRound(y0 + L * (a));pt2.x = cvRound(x0 - L * (-b));pt2.y = cvRound(y0 - L * (a));line(linImg, pt1, pt2, Scalar(255, 0, 0), 3, 8, 0);}

很明顯,上面的代碼中,L值是需要我們根據圖像的大小和直線的大小來確定,并不是每一幅圖像或每一條直線都取1000。L是什么的長度,博主在上面的手繪圖中應該是已經標注得很清楚了。

最后,對這篇博文有不明白的可以加博主的微信/QQ 2487872782交流。

總結

以上是生活随笔為你收集整理的利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。