Opencv——霍夫变换以及遇到的一些问题
目錄
- 問題1 :顏色空間轉(zhuǎn)換函數(shù)參數(shù)問題:CV_BGR2GRAY vs CV_GRAY2BGR
- 問題2:cvRound()、cvFloor()、cvCeil()函數(shù)用法
- 霍夫變換的含義
- 標(biāo)準(zhǔn)霍夫直線變換
- 霍夫線變換函數(shù)參數(shù)講解
- 累計概率霍夫變換
- 霍夫變換圓變換
- 原理和算法步驟:
- 霍夫圓變換函數(shù)參數(shù)講解
- 霍夫變換總結(jié)
- 參考鏈接
問題1 :顏色空間轉(zhuǎn)換函數(shù)參數(shù)問題:CV_BGR2GRAY vs CV_GRAY2BGR
OpenCV的顏色空間轉(zhuǎn)換函數(shù):
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )dstCn現(xiàn)在已經(jīng)改成COLOR_GRAY2BGR之類的以COLOR開頭的。
CV_BGR2GRAY :將RGB圖轉(zhuǎn)換成GRAY圖
CV_GRAY2BGR:將GRAY圖轉(zhuǎn)換成RGB圖
淺墨源碼
cvtColor(midImage, dstImage, COLOR_GRAY2BGR);
//將canny算子掃描后的二值圖轉(zhuǎn)化為RGB圖,原因是后面你可視化霍夫變換效果時,畫的曲線是彩色的。
問題2:cvRound()、cvFloor()、cvCeil()函數(shù)用法
cvRound():返回跟參數(shù)最接近的整數(shù)值,即四舍五入;
cvFloor():返回不大于參數(shù)的最大整數(shù)值,即向下取整;
cvCeil():返回不小于參數(shù)的最小整數(shù)值,即向上取整;
霍夫變換的含義
這個我在邊緣的文章中有涉及過,直接貼鏈接:
https://blog.csdn.net/qq_42604176/article/details/104300287
還有我參考的一個鏈接:
https://blog.csdn.net/yuyuntan/article/details/80141392
標(biāo)準(zhǔn)霍夫直線變換
霍夫線變換函數(shù)參數(shù)講解
●第一個參數(shù),InputArray類型的image, 輸入圖像,即源圖像。需為8位的單通道二進(jìn)制圖像
●第二個參數(shù),InputArray類型的lines,經(jīng)過調(diào)用HoughLines函數(shù)后儲存了霍 夫線變換檢測到線條的輸出矢量。每一條線由具有兩個元素的矢量( ρ, 0) 表示,其中,ρ是離坐標(biāo)原點(0,0) (也就是圖像的左上角)的距離,θ是弧度線條旋轉(zhuǎn)角度(0度表示垂直線,π/2 度表示水平線)。
●第三個參數(shù),double類型的rho,以像素為單位的距離精度。另-種表述方
式是直線搜索時的進(jìn)步尺寸的單位半徑。(Latex 中/rho即表示ρ )
●第四個參數(shù),double 類型的theta,
以弧度為單位的角度精度。另一種表述 方式是直線搜索時的進(jìn)步尺寸的單位角度。
●第五個參數(shù),int類型的threshold,累加平面的閾值參數(shù),即識別某部分為 圖中的一條直線時它在累加平面中必須達(dá)到的值。大于國值threshold的線段才可以被檢測通過并返回到結(jié)果中。
●第六個參數(shù),double類型的srn,, 有默認(rèn)值0。對于多尺度的霍夫變換,這 是第三個參數(shù)進(jìn)步尺寸rho的除數(shù)距離。粗略的累加器進(jìn)步尺寸直接是第三個參數(shù)rho,而精確的累加器進(jìn)步尺寸為rho/sm。
●第七個參數(shù),double 類型的stn, 有默認(rèn)值0,對于多尺度霍夫變換,sm表示第四個參數(shù)進(jìn)步尺寸的單位角度theta的除數(shù)距離。且如果sr和 stn同時為0,就表示使用經(jīng)典的霍夫變換。否則,這兩個參數(shù)應(yīng)該都為正數(shù)。
理解:在XY平面,直線有兩個參數(shù):K、B(斜率和截距),可視化直線,需要構(gòu)造x,y軸,假設(shè)XY軸的最小精度為1,則勾畫出的直線其實是一系列離散的點。隨著XY精度升高,所可視化出來的數(shù)據(jù)將越來越像一條線。
同理,在rho/theta平面,一條直線對應(yīng)平面上以rho為橫坐標(biāo),tehta為縱坐標(biāo)的一個點。
rho/theta的精度越高,所表示的直線越精準(zhǔn)。我想這邊是第三參數(shù)和第四參數(shù)的含義。
我們一般以rho=1,theta=1度的精度來構(gòu)造投票空間。
累計概率霍夫變換
C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )第一個參數(shù),InputArray類型的image,輸入圖像,即源圖像,需為8位的單通道二進(jìn)制圖像,可以將任意的源圖載入進(jìn)來后由函數(shù)修改成此格式后,再填在這里。
第二個參數(shù),InputArray類型的lines,經(jīng)過調(diào)用HoughLinesP函數(shù)后后存儲了檢測到的線條的輸出矢量,每一條線由具有四個元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每個檢測到的線段的結(jié)束點。
第三個參數(shù),double類型的rho,以像素為單位的距離精度。另一種形容方式是直線搜索時的進(jìn)步尺寸的單位半徑。
第四個參數(shù),double類型的theta,以弧度為單位的角度精度。另一種形容方式是直線搜索時的進(jìn)步尺寸的單位角度。
第五個參數(shù),int類型的threshold,累加平面的閾值參數(shù),即識別某部分為圖中的一條直線時它在累加平面中必須達(dá)到的值。大于閾值threshold的線段才可以被檢測通過并返回到結(jié)果中。
第六個參數(shù),double類型的minLineLength,有默認(rèn)值0,表示最低線段的長度,比這個設(shè)定參數(shù)短的線段就不能被顯現(xiàn)出來。
第七個參數(shù),double類型的maxLineGap,有默認(rèn)值0,允許將同一行點與點之間連接起來的最大的距離。
通過設(shè)定直線長度閾值,對過長或過短的直線不予理會。
//==================================累計概率霍夫變換============================================ int main() {//讀取原圖片Mat Image = imread("D:\\opencv_picture_test\\霍夫變換.png");//顯示原圖片namedWindow("【原圖】");imshow("【原圖】", Image);Mat srcImage = Image.clone();Mat midImage, dstImage;//進(jìn)行邊緣檢測和轉(zhuǎn)化為將灰度圖轉(zhuǎn)為RGB圖Canny(srcImage, midImage, 50, 200, 3);cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//定義矢量結(jié)構(gòu)lines用于存放得到的線段矢量集合vector<Vec4i> lines;//進(jìn)行霍夫變換HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);//依次在圖中繪制每條線段for (size_t i = 0;i < lines.size();i++) {Vec4i l = lines[i];line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 1, LINE_AA);}imshow("【邊緣檢測后的圖】", midImage);imshow("【效果圖】", dstImage);waitKey(0);return 0; }霍夫變換圓變換
原理和算法步驟:
霍夫圓變換函數(shù)參數(shù)講解
cvHoughCircles( CvArr* image, void* circle_storage, int method, double dp, double min_dist, double param1=100, double param2=100, int min_radius=0, int max_radius=0 );輸入:輸入 8-bit、單通道灰度圖像. circle_storage:檢測到的圓存儲倉. 可以是內(nèi)存存儲倉 (此種情況下,一個線段序列在存儲倉中被創(chuàng)建,并且由函數(shù)返回)或者是包含圓參數(shù)的特殊類型的具有單行/單列的CV_32FC3型矩陣(CvMat*).矩陣頭為函數(shù)所修改,使得它的 cols/rows 將包含一組檢測到的圓。如果 circle_storage是矩陣,而實際圓的數(shù)目超過矩陣尺寸,那么最大可能數(shù)目的圓被返回。 每個圓由三個浮點數(shù)表示:圓心坐標(biāo)(x,y)和半徑.
method:Hough 變換方式,目前 只支持HOUGH_GRADIENT
dp:累加器圖像的分辨率。這個參數(shù)允許創(chuàng)建一個比輸入圖像分辨率低的累加器。(這樣做是因為有理由認(rèn)為圖像中存在的圓會自然降低到與圖像寬高相同數(shù)量的范疇)。如果dp設(shè)置為1,則分辨率是相同的;如果設(shè)置為更大的值(比如2),累加器的分辨率受此影響會變小(此情況下為一半)。dp的值不能比1小。
min_dist:該參數(shù)是讓算法能明顯區(qū)分的兩個不同圓之間的最小距離。
param1:用于Canny的邊緣閥值上限,下限被置為上限的一半。
param2:累加器的閥值。
min_radius:最小圓半徑。
max_radius:最大圓半徑。
霍夫變換總結(jié)
1、為什么在霍夫變換求直線方程時,要用極坐標(biāo)的形式
斜截式不能表示垂直于x軸的直線,而極坐標(biāo)形式可以表達(dá)。
2、霍夫變換求直線方程,和使用最小二乘法求直線最小方程相比,有什么優(yōu)缺點
優(yōu)點:當(dāng)出現(xiàn)離群采樣點時最小二乘法會有很大誤差而霍夫變換不會
缺點:時間復(fù)雜度和空間復(fù)雜度都很高,只能檢測線段的方向,而不能確定線段的長度
參考鏈接
https://blog.csdn.net/timidsmile/article/details/9342855
https://blog.csdn.net/OliverkingLi/article/details/54754814?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158565498519724835852132%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158565498519724835852132&biz_id=0&utm_source=distribute.pc_search_result.none-task
http://www.manongjc.com/article/42132.html
https://stackoverflow.com/questions/5929125/opencv-houghcircles-param1-param2
https://blog.csdn.net/yuyuntan/article/details/80141392
淺墨大神博客
總結(jié)
以上是生活随笔為你收集整理的Opencv——霍夫变换以及遇到的一些问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卢克·凯奇剧情介绍
- 下一篇: Opencv——查找并绘制凸包、凸包与轮