將圖像空間直線 y = kx + b 映射到參數空間 (k, b) 或極坐標 (ρ, θ)。圖像中共線點在參數空間對應曲線相交於同一點,通過累加器投票檢測直線。
CvSeq* cvHoughLines2(
CvArr* image, // 8位單通道二值圖像(邊緣圖)
CvMemStorage* storage, // 內存存儲區
int method, // CV_HOUGH_STANDARD / CV_HOUGH_PROBABILISTIC / CV_HOUGH_MULTI_SCALE
double rho, // 距離分辨率(像素)
double theta, // 角度分辨率(弧度)
int threshold, // 累加器閾值
double param1 = 0, // 概率霍夫:最小線段長度
double param2 = 0 // 概率霍夫:最大線段間隙
);
void CCVMFCView::OnHoughLines() {
IplImage* src = 0;
IplImage* color_dst;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;
// 1. 獲取灰度圖
if (workImg->nChannels == 3) {
src = cvCreateImage(cvGetSize(workImg), IPL_DEPTH_8U, 1);
cvCvtColor(workImg, src, CV_BGR2GRAY);
} else {
src = cvCloneImage(workImg);
}
// 2. 邊緣檢測
IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
color_dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
cvFlip(src); // 翻轉(視具體坐標系需求)
cvCanny(src, dst, 50, 120, 3); // Canny 邊緣檢測
cvCvtColor(dst, color_dst, CV_GRAY2BGR); // 轉彩色用於繪製
// 3. 概率霍夫變換檢測線段
lines = cvHoughLines2(dst, storage, CV_HOUGH_PROBABILISTIC,
1, CV_PI/180, 20, // rho=1, theta=1度, threshold=20
20, 30); // minLineLength=20, maxLineGap=30
// 4. 繪製檢測到的線段
for (int i = 0; i < lines->total; i++) {
CvPoint* line = (CvPoint*)cvGetSeqElem(lines, i);
cvLine(color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0);
}
// 5. 顯示結果
cvNamedWindow("Hough", 1);
cvShowImage("Hough", color_dst);
cvWaitKey(0);
// 6. 釋放資源
cvReleaseMemStorage(&storage);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvDestroyWindow("Hough");
}
| 參數 | 含義 | 調大效果 | 調小效果 |
|---|---|---|---|
| rho | 距離分辨率 | 速度快、精度低 | 精度高、速度慢 |
| theta | 角度分辨率 | 速度快、角度粗糙 | 角度精細、計算量大 |
| threshold | 投票閾值 | 檢測線段少、強直線 | 檢測線段多、含噪聲 |
| minLineLength | 最小線段長度 | 過濾短線段 | 保留短線段 |
| maxLineGap | 最大線段間隙 | 連接斷開線段 | 嚴格分離線段 |
(ρ, θ),計算量大(x1,y1,x2,y2),速度快、適合實時概率霍夫變換 (CV_HOUGH_PROBABILISTIC) 是工程首選:直接輸出線段端點、參數直觀、速度快。配合 Canny 邊緣預處理,可穩健檢測圖像中的幾何結構。