霍夫變換是一種在圖像中尋找直線,圓及其他簡單形狀的方法。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;
} 運行結果:
