OpenCV3图像处理——霍夫曼变换直线检测
前言
1.直線檢測在好多實現應用中能用到到,我之前做過掃描件檢測時用直線檢測來處理判斷頁面是否水平,還有在輔助駕駛中的車道偏離預警系統也有過應用。
2.我的編程環境是Windows 7 64位,IDE是VS2015,配置了OpenCV3.3與OpenCV_Contrib,實現語言是C++。是于如果配置以上的環境,可以看我之前寫的博文。
一、概述
1.直線檢測的原理介紹
(1)對于直角坐標系中的任意一點A(x0,y0),經過點A的直線滿足Y0=kX0+b.(k是斜率,b是截距)。
(2)那么在X-Y平面過點A(x0,y0)的直線簇可以用Y0=kX0+b表示,但對于垂直于X軸的直線斜率是無窮大的則無法表示。因此將直角坐標系轉換到極坐標系就能解決該特殊情況。
(3)在極坐標系中表示直線的方程為ρ=xCosθ+ySinθ(ρ為原點到直線的距離)。
(4)對于任意一條直線上的所有點來說,變換到極坐標中,從[0~360]空間,可以得到r的大小,屬于同一條直線上點在極坐標空(r, theta)必然在一個點上有最強的信號出現,根據此反算到平面坐標中就可以得到直線上各點的像素坐標。從而得到直線。
2.OpenCV封裝有直線檢測的函數,HoughLines()和HoughLinesP(),它們都能實現直線檢測,差別是:HoughLines()函數使用標準的Hough變換HoughLinesP()函數使用概率Hough變換,即只通過分析點的子集并估計這些點都屬于一條直線的概率,這在計算速度上更快。
(1)HoughLines()函數說明:
HoughLines(
InputArray src, // 輸入圖像,必須8-bit的灰度圖像
OutputArray lines, // 輸出的極坐標來表示直線
double rho, // 生成極坐標時候的像素掃描步長
double theta, //生成極坐標時候的角度步長,一般取值CV_PI/180
int threshold, // 閾值,只有獲得足夠交點的極坐標點才被看成是直線
double srn = 0;// 是否應用多尺度的霍夫變換,如果不是設置0表示經典霍夫變換
double stn = 0;//是否應用多尺度的霍夫變換,如果不是設置0表示經典霍夫變換
double min_theta = 0; // 表示角度掃描范圍 0 ~180之間, 默認即可
double max_theta = CV_PI
)
(2)HoughLinesP()函數說明:
HoughLinesP(
InputArray src, // 輸入圖像,必須8-bit的灰度圖像
OutputArray lines, // 輸出的極坐標來表示直線
double rho, // 生成極坐標時候的像素掃描步長
double theta, //生成極坐標時候的角度步長,一般取值CV_PI/180
int threshold, // 閾值,只有獲得足夠交點的極坐標點才被看成是直線
double minLineLength = 0;// 最小直線長度
double maxLineGap = 0;// 最大間隔
)
二、代碼演示
1.傳入一張圖像,把所有直線畫出來。
void lineDetection(string image_path) {Mat src, src_gray, dst;src = imread(image_path);if (!src.data) {std::cerr << "無法打開圖像文件!" << endl;return;}namedWindow("input image", CV_WINDOW_AUTOSIZE);namedWindow("hough-line-detection", CV_WINDOW_AUTOSIZE);imshow("input image", src);//邊緣檢測Canny(src, src_gray, 150, 200);//灰度化cvtColor(src_gray, dst, CV_GRAY2BGR);vector<Vec2f> lines;//霍夫曼直線檢測Point pt1, pt2;HoughLines(src_gray, lines, 1, CV_PI / 180, 150, 0, 0);for (size_t i = 0; i < lines.size(); i++){// 極坐標中的r長度float rho = lines[i][0]; // 極坐標中的角度float theta = lines[i][1]; 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));line(dst, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);}imshow("matt", src);imshow("hough-line-detection", dst);waitKey(0); }2.運行結果
結語
1.例子很簡單,沒有什么難度,但應用時肯定要按自己的數據去做相關參數的設定。
2.關于工程的源碼,運行程序時的bug,都可以加這個群(487350510)互相討論學習。
總結
以上是生活随笔為你收集整理的OpenCV3图像处理——霍夫曼变换直线检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpneCV3特征提取及匹配SURF算法
- 下一篇: OpenCV图像处理——对比两张图像差异