霍夫變換是一種在圖像中尋找直線,圓及其他簡單形狀的方法。opencv支持兩種不同的霍夫變換:標准霍夫變換(SHT)和累積概率霍夫變換(PPHT)。在opencv中可以使用同一個函數來使用兩種算法。
相關函數如下:
CvSeq* cvHonghLines2(CvArr* image, void* line_storage,int mehtod, double rho, double theta, int threshold, double param1 =0, double param2 =0 );
image 輸入 8-比特、單通道 (二值) 圖像
line_storage 存儲檢測到的線段,可以是序列或者單行/單列矩陣
mehtod Hough 變換變量
rho 與象素相關單位的距離精度
image 輸入 8-比特、單通道 (二值) 圖像
line_storage 存儲檢測到的線段,可以是序列或者單行/單列矩陣
mehtod Hough 變換變量
rho 與象素相關單位的距離精度
theta
弧度測量的角度精度
threshold
閾值參數。如果相應的累計值大於 threshold, 則函數返回的這個線段
param1 和param2為與變換方法有關的參數
Reference《學習opencv》param1 和param2為與變換方法有關的參數
#include "StdAfx.h" #include<cv.h> #include<highgui.h> #include<math.h> int main() { IplImage* sourceImage; sourceImage= cvLoadImage("大中南.jpg",0); IplImage* destImage=cvCreateImage(cvGetSize(sourceImage),8,1); IplImage* colorImage=cvCreateImage(cvGetSize(sourceImage),8,3); //分配空間,默認64KB CvMemStorage* storage=cvCreateMemStorage(0); CvSeq* lines=0; //指向所檢測到的線的序列的第一條... //首先對源圖像進行邊緣檢測,結果以灰度圖顯示, cvCanny(sourceImage,destImage,50,200,3); cvCvtColor(destImage,colorImage,CV_GRAY2BGR); lines=cvHoughLines2(//返回一個指向CvSeq序列結構的的指針, destImage,//要進行霍夫檢測的圖像,必須是8位的, storage, //保存結果位置的指針, CV_HOUGH_PROBABILISTIC, 1, //這兩個參數都是用來設置直線的分辨率的 CV_PI/180, 80, //一個閾值 30, 10 //表示支持所返回的直線的點的數量 ); int index; //index為直線的索引 for(index=0;index<lines->total;index++) //遍歷每一條線 { CvPoint* line=(CvPoint*)cvGetSeqElem(lines,index); cvLine(colorImage,line[0],line[1],CV_RGB(255,0,0),3,8); } cvNamedWindow("SOURCEIMAGE",1); cvShowImage("SOURCEIMAGE",sourceImage); cvNamedWindow("COLORIMAGE",1); cvShowImage("COLORIMAGE",colorImage); cvNamedWindow("HOUGH",1); cvShowImage("HOUGH",colorImage); cvWaitKey(0); return 0; }運行結果:

