首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

OpenCV 霍夫變換直線檢測:cvHoughLines2 參數詳解與 MFC 實現示例

     編輯:關於C語言

霍夫變換原理

將圖像空間直線 y = kx + b 映射到參數空間 (k, b) 或極坐標 (ρ, θ)。圖像中共線點在參數空間對應曲線相交於同一點,通過累加器投票檢測直線。

OpenCV 實現:cvHoughLines2

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       // 概率霍夫:最大線段間隙
);

MFC 完整示例代碼

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最大線段間隙連接斷開線段嚴格分離線段

三種方法對比

  • CV_HOUGH_STANDARD:經典霍夫,返回無限長直線 (ρ, θ),計算量大
  • CV_HOUGH_PROBABILISTIC:概率霍夫,隨機采樣像素,直接返回線段端點 (x1,y1,x2,y2),速度快、適合實時
  • CV_HOUGH_MULTI_SCALE:多尺度霍夫,分階段細化參數空間

常見問題

  1. 預處理關鍵:必須先做邊緣檢測(Canny/Sobel),二值圖質量決定檢測效果
  2. 坐標系注意:OpenCV 原點在左上角,y 軸向下,角度從 x 軸逆時針
  3. 內存管理:IplImage/CvMemStorage 需手動釋放,現代 C++ 推薦使用 cv::Mat / cv::Ptr 自動管理

總結

概率霍夫變換 (CV_HOUGH_PROBABILISTIC) 是工程首選:直接輸出線段端點、參數直觀、速度快。配合 Canny 邊緣預處理,可穩健檢測圖像中的幾何結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved