OpenCV-霍夫變換

OpenCV-霍夫變換


author@jason_ql
http://blog.csdn.net/lql0716/


  • 標準霍夫變換(Standard Hough Transform, SHT)
  • 多尺度霍夫變換(Multi—Scale Hough Transform, MSHT)
  • 累計概率霍夫變換(Progressive Probabilistic Hough Transform,PPHT)

相關函數

  • HoughLines()直線檢測
    該函數對應標準霍夫變換(SHT)、多尺度霍夫變換(MSHT)。

C++: void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0)

第一個參數:InputaArray類型的image,原圖像,8位單通道二進制。
第二個參數:InputArray類型的lines,經過調用HoughLines函數後儲存了霍夫變換檢測到線條的輸出矢量。每一條線由具有兩個元素的矢量(rou,theta)表示,其中rou爲到座標原點(0,0)(原點爲圖像的左上角)的距離,theta是弧度線條旋轉角度(0度表示垂直線,pi/2度表示水平線)。
第三個參數:double類型的rho,以像素爲單位的距離精度。另一種表述方式是直線搜索時的進步尺寸的單位角度。
第四個參數:double類型的theta,以弧度爲單位的角度精度。另一種表述方式是直線搜索時的進步尺寸的單位角度。
第五個參數:int類型的threshold,累加平面的閾值參數,即識別某部分爲圖中的一條直線時它在累加平面中必須達到的值。大於閾值threshold的線段纔可以被檢測通過並返回到結果中。
第六個參數:double類型的srn,默認值爲0.對於多尺度的霍夫變換,這是第三個參數進步尺寸rho的除數距離。粗略的累加器進步尺寸直接是第三個參數rho,而精確的累加器進步尺寸爲rho/srn。
第七個參數:double類型的stn,默認值爲0.對於多尺度霍夫變換,srn表示第四個參數進步尺寸的單位角度theta的除數距離。且如果srn和stn同時爲0,就表示使用經典的霍夫變換,否則這兩個參數應該都爲正數。

  • HoughLinesP() 直線檢測
    該函數對應累計概率霍夫變換PPHT。

  • HoughCircles() 圓檢測

  • 霍夫變換示例代碼

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
//    String path = "/home/jason/jason2/photo/cylinder/target_cylinder.jpg";
    String path = "/home/jason/jason2/photo/cylinder/01.jpg";
    cv::Mat img1, img2, gray1, gray2;
    img1 = cv::imread(path);
    cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);

    cv::Canny(img1, img2, 50, 100);
//    cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);

    cv::vector<Vec2f> lines;
    cv::HoughLines(img2, lines, 1, CV_PI/180, 150, 0, 0);

    cv::Point v0;
    v0.x = 0;
    v0.y = 1;

    for(size_t i = 0; i < lines.size(); i++)
    {
        float rho = lines[i][0], theta = lines[i][1];
        cv::Point pt1, pt2, v1;
        double a = cos(theta), b = sin(theta);
        double x0 = a*rho, y0 = b*rho;

        pt1.x = round(x0 + 1000 * (-b));
        pt1.y = round(y0 + 1000 * a);
        pt2.x = round(x0 - 1000 * (-b));
        pt2.y = round(y0 - 1000 * a);

        v1 = pt1 - pt2;

        if( (v0.x * v1.y + v0.y * v1.x) == 0)
        {
            line(img1, pt1, pt2, Scalar(0, 255, 0), 2, CV_AA);
        }

    }

    cv::namedWindow("原圖", cv::WINDOW_NORMAL);
    cv::namedWindow("直線", cv::WINDOW_NORMAL);
    cv::imshow("原圖", img1);
    cv::imshow("直線", img2);

    cv::waitKey(0);
    return 0;

}
#霍夫變換圓檢測

#include <cv.h>
#include <highgui.h>
#include <math.h>

using namespace cv;

int main(int argc, char** argv)
{
    Mat img, gray;
    if( argc != 2 && !(img=imread(argv[1], 1)).data)
        return -1;
    cvtColor(img, gray, CV_BGR2GRAY);
    // smooth it, otherwise a lot of false circles may be detected
    GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
    vector<Vec3f> circles;
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
                 2, gray->rows/4, 200, 100 );
    for( size_t i = 0; i < circles.size(); i++ )
    {
         Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
         int radius = cvRound(circles[i][2]);
         // draw the circle center
         circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 );
         // draw the circle outline
         circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 );
    }
    namedWindow( "circles", 1 );
    imshow( "circles", img );
    return 0;
}

  • 相關文章
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章