1. 程式人生 > >OpenCV函數cvHoughLines2進行Hough變換

OpenCV函數cvHoughLines2進行Hough變換

-m ali edit clu -a 結果 depth ont 線上

霍夫變換(Hough Transform)是圖像處理中的一種特征提取技術,它通過一種投票算法檢測具有特定形狀的物體。該過程在一個參數空間中通過計算累計結果的局部最大值得到一個符合該特定形狀的集合作為霍夫變換結果。霍夫變換於1962年由Paul Hough 首次提出[53],後於1972年由Richard Duda和Peter Hart推廣使用[54],經典霍夫變換用來檢測圖像中的直線,後來霍夫變換擴展到任意形狀物體的識別,多為圓和橢圓。

Hough變換用來在圖象中查找直線。它的原理很簡單:假設有一條與原點距離為s,方向角為θ的一條直線,如

7.6示。

技術分享圖片

直線上的每一點都滿足方程

技術分享圖片

我們知道,一條直線在直角坐標系下可以用y=kx+b表示, 霍夫變換的主要思想是將該方程的參數和變量交換,即用x,y作為已知量k,b作為變量坐標,所以直角坐標系下的直線y=kx+b在參數空間表示為點(k,b),而一個點(x1,y1)在直角坐標系下表示為一條直線y1=x1·k+b,其中(k,b)是該直線上的任意點。為了計算方便,我們將參數空間的坐標表示為極坐標下的s和θ。因為同一條直線上的點對應的(s,θ)是相同的,因此可以先將圖片進行邊緣檢測,然後對圖像上每一個非零像素點,在參數坐標下變換為一條直線,那麽在直角坐標下屬於同一條直線的點便在參數空間形成多條直線並內交於一點。因此可用該原理進行直線檢測。

技術分享圖片

在Opencv中已經有了利用Hough變換在二值圖中找到直線的接口了,這裏就直接調用,下面是我的實例:

#include<cv.h>
#include<highgui.h>

#pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma comment(lib, "highgui.lib")

int main() { IplImage* pImgSrc = NULL; //源圖像 IplImage* pImg8u = NULL; //灰度圖 IplImage* pImgCanny = NULL; //邊緣檢測後的圖 IplImage* pImgDst = NULL; //在圖像上畫上檢測到的直線後的圖像 CvSeq* lines = NULL; CvMemStorage* storage = NULL; /*邊緣檢測*/ pImgSrc = cvLoadImage ("1.jpg", 1); pImg8u = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 1); pImgCanny = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 1); pImgDst = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 1); cvCvtColor (pImgSrc, pImg8u, CV_BGR2GRAY); cvCanny (pImg8u, pImgCanny, 20, 200, 3); /*檢測直線*/ storage = cvCreateMemStorage (0); lines = cvHoughLines2 (pImgCanny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 200, 10); pImgDst = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 3); cvCvtColor (pImg8u, pImgDst, CV_GRAY2BGR); /*在pImgDst上畫出檢測到的直線*/ for (int i = 0; i < lines->total; i++) { CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i); cvLine (pImgDst, line[0], line[1], CV_RGB(255,0,0), 3, 8); } cvNamedWindow ("src",1); cvNamedWindow ("canny", 1); cvNamedWindow ("hough", 1); cvShowImage ("src", pImgSrc); cvShowImage ("canny", pImgCanny); cvShowImage ("hough", pImgDst); cvWaitKey (0); cvReleaseImage (&pImgSrc); cvReleaseImage (&pImg8u); cvReleaseImage (&pImgCanny); cvReleaseImage (&pImgDst); cvReleaseMemStorage (&storage); return 0; }

結果如下:

源圖:

技術分享圖片

Canny算子進行邊緣檢測結果:

技術分享圖片

Hough變換檢測直線:

技術分享圖片

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

OpenCV函數cvHoughLines2進行Hough變換