1. 程式人生 > 其它 >opencv判斷直線和多邊形的交點_OpenCV學習筆記(八)之霍夫直線變換

opencv判斷直線和多邊形的交點_OpenCV學習筆記(八)之霍夫直線變換

技術標籤:opencv判斷直線和多邊形的交點

一. 霍線變換介紹

  1. Hough Line Transform用來做直線檢測
  2. 前提條件--邊緣檢測已經完成
  3. 平面空間到極座標空間轉換

  在影象平面空間上的多個點對映到(r-θ)座標空間中,形成多條曲線。多條曲線有共同的交點,即表明這幾個點在影象平面空間中是共線的。

7ad84b73804cd73ee92c6f62185758fd.png

  標準的霍夫變換cv::HoughLines從平面座標轉換到霍夫空間,最終輸出是(θ, r)表示極座標空間。

  霍夫變換直線概率cv::HoughLinesP最終輸出是直線的兩個點(x0, y0, x1, y1)。

二. 霍夫變換API介紹

1. cv::HoughLines

cv::HoughLines(
    InputArray src,     //輸入影象,必須是8-bit的灰度影象
    OutputArray lines,  //輸出的極座標表示直線
    double rho,             //生成極座標的畫素掃描步長
    double theta,           //生成極座標的角度步長
    int threshold,          //閾值,只有獲得足夠交點的極座標點才能看成是直線
    double srn = 0,     //是否應用多遲鈍霍夫變換,如果不是設定0表示經典霍夫變換
    double stn = 0,     //是否應用多遲鈍霍夫變換,如果不是設定0表示經典霍夫變換
    double min_theta = 0,   //表示角度掃描範圍0-180之間
    double max_theta = CV_PI
)

2. cv::HoughLineP

cv::HoughLinesP(
    InputArray src,     //輸入影象,必須是8-bit的灰度影象
    OutputArray lines,  //輸出的極座標表示直線
    double rho,             //生成極座標的畫素掃描步長
    double theta,           //生成極座標的角度步長
    int threshold,          //閾值,只有獲得足夠交點的極座標點才能看成是直線
    double minLineLength=0, //最小直線長度
    double maxLineGap=0 //最大間隔
)

三. 霍夫變換應用程式碼:

/*****霍夫變換*****/


#include<iostream>
#include<opencv2/opencv.hpp>
#include<string>
#include<vector>
using namespace std;

string in_title = "input image";
string ou_title = "output image";

int main() {
    cv::Mat src, dst,gray_src;
    src = cv::imread("1.jpg");
    cv::namedWindow(in_title, cv::WINDOW_NORMAL);
    cv::imshow(in_title, src);

    //先提取邊緣
    cv::Canny(src, gray_src, 150, 200);
    cv::namedWindow("edge image", cv::WINDOW_NORMAL);
    cv::imshow("edge image", gray_src);

    //儲存霍夫變換後的直線點座標,兩對
    vector<cv::Vec4f> plines;
    cv::HoughLinesP(gray_src, plines, 1, CV_PI / 180.0, 10, 0, 10);
    //定義顏色
    cv::Scalar color = cv::Scalar(0, 0, 255);
    //畫出直線
    cv::cvtColor(gray_src, dst, cv::COLOR_GRAY2BGR);
    for (size_t i = 0; i < plines.size(); ++i) {
        cv::Vec4f hline = plines[i];
        cv::line(dst, cv::Point(hline[0], hline[1]), cv::Point(hline[2], hline[3]),
            color, 3, cv::LINE_AA);
    }
    cv::namedWindow(ou_title, cv::WINDOW_NORMAL);
    cv::imshow(ou_title, dst);

    cv::waitKey(0);
    return 0;
}

點進來,關注我 開發小鴿 看更多CV,深度學習,程式設計學習筆記,更有海量原始碼等你來拿!!!

讓我們一起學習,一起進步!!!

OpenCV學習筆記​zhuanlan.zhihu.com d78d227c180a89364a89860fd5ab88dd.png 機器學習筆記​zhuanlan.zhihu.com d78d227c180a89364a89860fd5ab88dd.png C++學習筆記​zhuanlan.zhihu.com d78d227c180a89364a89860fd5ab88dd.png 深度學習筆記​zhuanlan.zhihu.com d78d227c180a89364a89860fd5ab88dd.png