【OpenCV】影像變換(四-1)-霍夫變換線段檢測
霍夫變換是一種在影像中尋找直線、圓及其他形狀的方法。原始的霍夫變化是一種直線變換,即在二值影像中尋找直線的一種相對快速方法,變換可以推廣到其他普通的情況,而不僅僅是簡單的直線。在這篇博文中,我們先對霍夫變換的線段檢測討論下。
(1)霍夫變換的線段檢測理論
如下圖所示,在直角座標系中有一條直線l,原點到該直線的垂直距離是ρ,垂線與X軸的夾角θ,則這條直線是唯一的,且其方程為:
而這條直線用極座標表示為(ρ,θ),可見直角座標系中的一條直線對應著極座標下的一點,這種線到點的變換就是Hough變換。
在直角座標系中,過任意一點(x0,y0)的直線系,如下圖所示,滿足
其中:
而這些直線在極座標系中所對應的點(ρ,θ)構成一條正弦曲線,反之,在極座標系中在這條正弦曲線上的點均對應著直角座標系中過(x0,y0)的一條直線,如圖所示:
設平面上有若干點,過每點的直線系分別對應於極座標系上的一條正弦曲線,若這些正弦曲線有共同的交點(ρ’,θ’),如圖所示,這些點共線,且這些點對應的直線方程為:
這就是Hough變換檢測直線的原理。
在OpenCV中給出了相關的基於霍夫變換的線段檢測函式cvHoughLines2(),下面簡要介紹下這個函式的各個引數意義。
CvSeq* cvHoughLines2(
CvArr* image,//輸入影像,必須為8位的二值影像
void* line_storage,//指向儲存結果位置的指標
int method,//CV_HOUGH_STANDARD、PROBABILISTIC等
double rho,
double theta,//rho,theta是設定直線的解析度,單位分別為畫素和弧度
int threshold,//一條直線在累計平面中必須要達到的值
double param1=0,
double param2=0
)
上面這個函式返回的結果是一個指向記憶體塊的指標,所以在畫出檢測到的直線時,要遍歷這個序列。下面給出這個程式的示例。
(2)程式示例及執行結果
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
int main()
{
const char *pSrcWindow = "原圖";
const char *pDstWindow = "Hough圖";
IplImage *pSrcImage = cvLoadImage("1.png", CV_LOAD_IMAGE_UNCHANGED);
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
//通過canny檢測得到二值圖,因為cvHoughLines2()中第一個引數輸入影像必須是8位二值影像
IplImage *pCannyImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCanny(pGrayImage, pCannyImage, 30, 90, 3);
//設定引數數值
CvMemStorage *line_storage = cvCreateMemStorage();
double rho = 1;
double theta = CV_PI / 180;
int threshold = 50;
double param1 = 50;
double param2 = 10;
//呼叫函式cvHoughLines2()函式,返回檢測到的線段序列
CvSeq* LineSeq = cvHoughLines2(pCannyImage, line_storage, CV_HOUGH_PROBABILISTIC, rho, theta, threshold, param1, param2);
//建立輸出影像,並將影像從灰度圖轉換到RGB空間
IplImage *pDstImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3);
cvCvtColor(pCannyImage, pDstImage, CV_GRAY2BGR);
//畫出檢測到的線段,因為在函式cvHoughLines2()返回得到的是一個序列seq,下面其實是這個序列的遍歷;
for (int i = 0; i < LineSeq->total; ++i)
{
CvPoint* p = (CvPoint*)cvGetSeqElem(LineSeq, i);
cvLine(pDstImage, p[0], p[1], CV_RGB(255, 0, 0), 2);
}
cvNamedWindow(pSrcWindow, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pDstWindow, CV_WINDOW_AUTOSIZE);
cvShowImage(pSrcWindow, pSrcImage);
cvShowImage(pDstWindow, pDstImage);
cvWaitKey();
cvReleaseMemStorage(&line_storage);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pCannyImage);
cvReleaseImage(&pDstImage);
cvDestroyWindow(pSrcWindow);
cvDestroyWindow(pDstWindow);
return 0;
}
執行的結果如下:
相關文章
- 【OpenCV】影像變換(四-2)霍夫變換圓檢測OpenCV
- 霍夫變換檢測圓
- 霍夫變換圓檢測原理及 OpenCV API 應用OpenCVAPI
- OpenCV-Python教程(9)(10)(11): 使用霍夫變換檢測直線 直方圖均衡化 輪廓檢測OpenCVPython直方圖
- 【OpenCV】影像的變換(三)-Canny邊緣檢測OpenCV
- OpenCV計算機視覺學習(3)——影像灰度線性變換與非線性變換(對數變換,伽馬變換)OpenCV計算機視覺
- 霍夫檢測圓:霍夫梯度法梯度
- 【OpenCV-Python】:影像的傅立葉變換與逆傅立葉變換OpenCVPython
- OpenCvSharp手繪ROI區域+模板匹配+霍夫變換檢測圓的邊界OpenCV
- 用霍夫變換&SCNN碼一個車道追蹤器CNN
- OpenCV計算機視覺學習(11)——影像空間幾何變換(影像縮放,影像旋轉,影像翻轉,影像平移,仿射變換,映象變換)OpenCV計算機視覺
- Python 影像處理 OpenCV (5):影像的幾何變換PythonOpenCV
- Qt5&OpenCV3.2 Canny邊緣檢測+Hough變換QTOpenCV
- OpenGL模型檢視變換、投影變換、視口變換模型
- OpenCV 離散傅立葉變換OpenCV
- 計算機視覺 OpenCV Android | 基本特徵檢測之 霍夫圓檢計算機視覺OpenCVAndroid特徵
- OpenCV計算機視覺學習(10)——影像變換(傅立葉變換,高通濾波,低通濾波)OpenCV計算機視覺
- 【OpenCV】影像變換(二)邊緣檢測:梯度運算元、Sobel運算元和Laplace運算元OpenCV梯度
- 3. OpenCV-Python——影像梯度演算法、邊緣檢測、影像金字塔與輪廓檢測、直方圖與傅立葉變換OpenCVPython梯度演算法直方圖
- 詳解 Hough 變換(基本原理與直線檢測)
- Python 實現影像快速傅立葉變換和離散餘弦變換Python
- opencv 圖片幾何變換-縮放OpenCV
- opencv距離變換函式distanceTransformOpenCV函式ORM
- OpenGL 使用矩陣變換改變檢視矩陣
- Hough變換與FCM演算法相結合檢測車道線演算法
- 【影像處理筆記】小波變換筆記
- OpenCV (iOS)中的形態學變換(11)OpenCViOS
- 計算機圖形學(四)_幾何變換_1_基本的二維幾何變換(一)計算機
- 小波變換檢測訊號突變點的MATLAB實現Matlab
- View Transform(檢視變換)詳解ViewORM
- Python的OpenCV轉換影像大小PythonOpenCV
- 計算機圖形學(四)_幾何變換_1_基本的二維幾何變換(二)_旋轉計算機
- 計算機圖形學(四)_幾何變換_1_基本的二維幾何變換(三)_縮放計算機
- opencv 影像的型別轉換、影像的縮放OpenCV型別
- Hough變換
- 傅立葉變換
- 網頁影像漸變的方法(HTML+CSS) (漸變與切換)網頁HTMLCSS
- 使用世界變換的逆轉置矩陣對法線進行變換矩陣