21.ハフ変換直線検出

1.主な内容

  • ハフライン変換の概要
  • 関連するAPIの学習

2.ハフライン変換の概要

  • Hough Line Transformは線形変換に使用されます

  • 前提条件エッジの検出と完了

  • 平面空間から極座標空間への変換

  • ハフ変換により、規則的な幾何学的形状を検出できます。原理は、極座標を変更して直交座標の各点を極座標空間に変換し、曲線を形成することです。画像内の曲線の交点の位置は、は同じ直線上の点であり、これらの点の極座標を数式を通じて直交座標空間に計算します。
    ここに画像の説明を挿入

  • rは距離です。x0とy0を変更せずに、与えられたシータごとにr値を取得します。このとき、図1の各角度とr 'の関係の曲線を取得します。
    ここに画像の説明を挿入

  • この時点で、x0、y0を1つ前に移動してから、関数thetaとrの極座標を見つけ、操作を繰り返して、図2に示す結果を得ます。これらの曲線は1つの点で交差し、ピクセルがすべて同じ直線に属していることを示しています。
    ここに画像の説明を挿入

  • 図2によると、曲線の交点の角度と極の直径が次の式に取り込まれて平面空間に戻り、異なるxを入力し、異なるyを取得します。
    取得した座標点は画像上に保持され、画像上になければ削除されます。
    ここに画像の説明を挿入

  • 質問:これが画像の交点であることをどのようにして知っていますか?
    回答:各曲線が通過するデータに1を追加します。交差点のデータが最も多く、次にポイントが最も明るいためです。
    ここに画像の説明を挿入

  • 直線上のすべての点について、極座標に変換します。[0・360]空間から、rのサイズを取得できます。極座標空間[r、theta]の同じ線に属する点は、ある点で信号(交点)が最も強くなければならず、線上の各点のピクセル座標は、平面座標を逆に計算することによって取得できます。これにより直線になります。

  • 平面座標からハフ空間(極座標)への変換
    ここに画像の説明を挿入

3.関連するAPIの学習

  • 標準のハフ変換cv :: HoughLinesは平面座標からハフ空間に変換され、最終的な出力は極座標空間を表す(threta、r)です。
  • ハフ変換直線確率cv ;; HoughLinesP最終出力は直線の2点(x0、y0、x1、y1)です。

4.関連するAPIの学習

  • cv ;; HonghLines
cv::HoughLine(
    InputArray src,   //输入图像,必须8—bit的灰度图像
    OutputArray lines,//输出的极坐标来表示直线
    double rho, //生成极坐标的时候像素扫描步长(极坐标空间中r的最大值),一般取值1
    double theta,//生成极坐标的时候的角度扫描步长,一般取值CV_PI/180,每次移动一度
    int threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线
    double srn = 0,//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换(此处的多尺度参考图像金字塔的相关知识)
    double stn = 0.//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
    double min_theta = 0,//表示角度扫描范围0-180度之间,默认即可
    double max_theta = CV_PI
)//一般是有经验的开发者使用,需要自己反变换到平面空间
  • cv :: HonghLinesP
cv::HoughLineP(
    InputArray src,   //输入图像,必须8—bit的灰度图像
    OutputArray lines,//输出的极坐标来表示直线
    double rho, //生成极坐标的时候像素扫描步长
    double theta,//生成极坐标的时候的角度扫描步长,一般取值CV_PI/180
    int threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线
    double minlineLength = 0,//最小直线长度
    double maxLineGap = 0,//最大间隔,比较重要的一个参数
    )//自动反算到平面空间

HonghLinesP検出効果
ここに画像の説明を挿入

  • デモコード
//先进行边缘检测
imshow("原图像",src);
Canny(src,src_gray,150,200,3);
cvtColor(src_gray,dst,CV_GRAY2BGR);
//霍夫直线检测
vector<Vec4f>plines;//将我们霍夫变换得到的结果存放到这个数据中
HonghLinesP(src_gray,plines,1,CV_PI/180,10,0,10);
for(size_t i = 0;i < plines.size();i++){
    Vec4f  h1 = plines[i];
    line(dst,Point(h1[0],h1[1]),Point(h1[2],h1[3]),Scalar(0,0,255),3,LINE_AA);
}  
imshow("输出图像",dst);

5.line関数

void  line(
    Mat& img, //要绘制线段的图像
    Point pt1,//线段的起点
    Point pt2,//线段的终点
    const Scalar& color,//线段的颜色,通过一个Scalar对象定义
    int thickness = 1,//线条的宽度
    int linetType = 8,
    //线条的类型。可以取值8,4,和CV_AA,
    //分别代表8邻接连接线、4邻接连接线和反锯齿连接线
   // 默认值为8邻接连接线,为了获得更好的效果可以选用CV_AA(采用了高斯滤波)
    int shift = 0 //坐标点小数点位数
)

例:

line(frame,beginPoint,endPoint,Scalar(0,0,255),2)
//画一条直线,起点为beginPoint,终点为endPoint,颜色是红色,线宽为2,shift是默认值

6.課外拡張

size_tデータ型
OpenCV CV_RGB2GRAYとCV_BGR2GRAY OpenCV Image Watchプラグインのインストールと使用の違い

公開された66元の記事 ウォン称賛53 ビュー6812

おすすめ

転載: blog.csdn.net/qq_43367829/article/details/105423785