資源簡介
霍夫線變換源代碼, 有注釋方便快速掌握源代碼。 希望能夠幫助大家。
代碼片段和文件信息
int?main(?int?argc?char**?argv?)??
{??
????Mat?src?edgecolor_edge;??
????src=imread(“building.jpg“);??
????if(!src.data)????
????????return?-1;????
??
????Canny(srcedge502003);??
????cvtColor(edge?color_edge?CV_GRAY2BGR);??
????vector?lines;??//保存直線的首端和尾端。
????HoughLinesP(edge?lines?1?CV_PI/180?80?30?10);??
????for(?size_t?i?=?0;?i? ????{??
????????Vec4i?l?=?lines[i];??
????????line(color_edge?Point(l[0]?l[1])?Point(l[2]?l[3])?Scalar(00255)?2);??
????}??
??
????namedWindow(?“lines“?CV_WINDOW_AUTOSIZE?);??
????imshow(?“lines“?color_edge?);??
????waitKey(0);??
??
????return?0;??
}
static?void??
icvHoughLinesProbabilistic(?CvMat*?image??
????????????????????????????float?rho?float?theta?int?threshold??
????????????????????????????int?lineLength?int?lineGap??
????????????????????????????CvSeq?*lines?int?linesMax?)??//
{??
????//accum?為累加器矩陣,mask?為掩碼矩陣????
????cv::Mat?accum?mask;??//收集圖像中的所有非零點保存在掩碼矩陣中??非零點就是邊緣點
????cv::vector?trigtab;????//?用于存儲事先計算好的正弦和余弦值??
????//?開辟一段內存空間??
????cv::MemStorage?storage(cvCreateMemStorage(0));??
????//?用于存儲特征點坐標,即邊緣像素的位置??
????CvSeq*?seq;????//????seq?為所有邊緣點坐標位置的序列
????CvSeqWriter?writer;??//???存儲序列容器
????int?width?height;????//?圖像的寬和高??
????int?numangle?numrho;????//?角度和距離的離散數量??
????float?ang;?????????????????????//普通變量
????int?r?n?count;??????//?count用來得到邊緣點的數量
????CvPoint?pt;?????????//像素點
????float?irho?=?1?/?rho;????//?距離分辨率的倒數??
????CvRNG?rng?=?cvRNG(-1);????//?隨機數??
????const?float*?ttab;????//?向量?trigtab?的地址指針??
????uchar*?mdata0;????//?矩陣?mask?的地址指針??
????//?確保輸入圖像的正確性??
????CV_Assert(CV_IS_MAT(image)?&&?CV_MAT_TYPE(image->type)?==?CV_8UC1?);??
??
????width?=?image->cols;????//?提取出輸入圖像的寬??
????height?=?image->rows;????//?提取出輸入圖像的高??
????//?由角度和距離分辨率,得到角度和距離的離散數量
//numangle霍夫空間的?wigth也就是?theta的個數,theta為一個單位?
????numangle?=?cvRound(CV_PI?/?theta);???//霍夫空間的?wigth???cvRound(double?value):對一個double型的數進行四舍五入,并返回一個整型數
????numrho?=?cvRound(((width?+?height)?*?2?+?1)?/?rho);//霍夫空間的?hight??為什么hight是這么算???
????//?創建累加器矩陣,即霍夫空間??
????accum.create(numangle?numrho?CV_32SC1);??
????//?創建掩碼矩陣,大小與輸入圖像相同??
????mask.create(height?width?CV_8UC1);??//為什么要創建掩碼矩陣呢??
????//?定義?trigtab?的大小,因為要存儲正弦和余弦值,所以長度為角度離散數的?2?倍??
????trigtab.resize(numangle*2);??
????//?累加器矩陣清零??
????accum?=?cv::Scalar(0);??
????//?避免重復計算,事先計算好所需的所有正弦和余弦值??
????for(ang?=?0?n?=?0;?n?????{??
????????trigtab[n*2]?=?(float)(cos(ang)?*?irho);??//?irho=1??是?距離分辨率的倒數
????????trigtab[n*2+1]?=?(float)(sin(ang)?*?irho);??
????}??
????//?賦值首地址??
????ttab?=?&trigtab[0];??//?ttab?是?向量?trigtab?的地址指針
????mdata0?=?mask.data;??//mdata0?是?掩碼矩陣?mask?的地址指針??
????//?開始寫入序列??
????cvStartWriteSeq(?CV_32SC2?sizeof(CvSeq)?sizeof(CvPoint)?storage?&writer?);??
??
????//?stage?1.?collect?non-zero?image?points??
????//?收集圖像中的所有非零點保存在掩碼矩陣中,
//因為輸入圖像是邊緣圖像,所以非零點就是邊緣點??
????for(pt.y?=?0?cou
- 上一篇:底部導航欄.rar
- 下一篇:LSD直線檢測源代碼
評論
共有 條評論