1. 程式人生 > >霍夫變換檢測直線原理及例項

霍夫變換檢測直線原理及例項

霍夫變換原理

  1. 霍夫變換(Hough Transform)是影象處理中的一種特徵提取技術,該過程在一個引數空間中通過計算累計結果的區域性最大值得到一個符合該特定形狀的集合作為霍夫變換結果。
    在這裡插入圖片描述
  2. 直線可以由直角座標或極座標表示,直線可以由直角座標或極座標表示,直角座標表示直線時,垂直於x軸的直線斜率不能表示,所以選擇極座標
    對於霍夫變換, 我們將採用第二種方式極座標系來表示直線. 因此, 直線的表示式可為:

在這裡插入圖片描述
化簡便可得到:
在這裡插入圖片描述
一般來說對於點, 我們可以將通過這個點的一族直線統一定義為:

在這裡插入圖片描述
這就意味著每一對座標代表一條通過點(x0,y0)的直線。

  1. 如果對於一個給定點我們在極座標對極徑極角平面繪出所有通過它的直線, 將得到一條正弦曲線. 例如, 對於給定點X_0= 8 和Y_0= 6 我們可以繪出下圖 (在平面):在這裡插入圖片描述
  2. 我們可以對影象中所有的點進行上述操作. 如果兩個不同點進行上述操作後得到的曲線在平面相交, 這就意味著它們通過同一條直線. 在這裡插入圖片描述
    5.以上的說明表明,一般來說, 一條直線能夠通過在平面 尋找交於一點的曲線數量來檢測。而越多曲線交於一點也就意味著這個交點表示的直線由更多的點組成. 一般來說我們可以通過設定直線上點的閾值來定義多少條曲線交於一點我們才認為檢測到了一條直線。霍夫變換它追蹤影象中每個點對應曲線間的交點. 如果交於一點的曲線的數量超過了閾值,則認為是一條直線。

例項

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>  //opencv申明
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
	Mat img = imread("D:\\program\\zheng1.png");
	Mat dst,src;
	Canny(img,src,50,50);  //邊緣檢測
	//方法1(標準霍夫變換)
	cvtColor(src, dst, CV_GRAY2BGR); //灰度

    vector<Vec2f> lines;
     HoughLines(src, lines, 1, CV_PI / 180, 80, 0, 0);
     for (size_t i = 0; i < lines.size(); i++) 
	 {
     float rho = lines[i][0]; // 極座標中的r長度
     float theta = lines[i][1]; // 極座標中的角度
     Point pt1, pt2;
     double a = cos(theta), b = sin(theta);
     double x0 = a * rho, y0 = b * rho;
        // 轉換為平面座標的四個點
     pt1.x = cvRound(x0 + 1000 * (-b));//對一個double型的數進行四捨五入,並返回一個整型數!
     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("xiaoguotu",dst);
	 waitKey(0);
}

在這裡插入圖片描述

引數詳解

第一個引數,InputArray型別的image,輸入影象,即源影象,需為8位的單通道二進位制影象,可以將任意的源圖載入進來後由函式修改成此格式後,再填在這裡。
第二個引數,InputArray型別的lines,經過呼叫HoughLines函式後儲存了霍夫線變換檢測到線條的輸出向量。每一條線由具有兩個元素的矢量表示,其中,是離座標原點((0,0)(也就是影象的左上角)的距離。
第三個引數,double型別的rho,以畫素為單位的距離精度。另一種形容方式是直線搜尋時的進步尺寸的單位半徑。
第四個引數,double型別的theta,以弧度為單位的角度精度。另一種形容方式是直線搜尋時的進步尺寸的單位角度。
第五個引數,int型別的threshold,累加平面的閾值引數,即識別某部分為圖中的一條直線時它在累加平面中必須達到的值。大於閾值threshold的線段才可以被檢測通過並返回到結果中。
第六個引數,double型別的srn,有預設值0。對於多尺度的霍夫變換,這是第三個引數進步尺寸rho的除數距離。粗略的累加器進步尺寸直接是第三個引數rho,而精確的累加器進步尺寸為rho/srn。
第七個引數,double型別的stn,有預設值0,對於多尺度霍夫變換,srn表示第四個引數進步尺寸的單位角度theta的除數距離。且如果srn和stn同時為0,就表示使用經典的霍夫變換。否則,這兩個引數應該都為正數。