Opencv3 C++ VS2017 学习笔记 16 霍夫变换

  • 霍夫直线变换
    • 直线的方程表示可以由斜率和截距表示
      • \large y=kx+b
      • 用参数空间(k,b)也是可以表示一条直线的
      • 但是存在k-->∞的情况,因此提出霍夫变换
    • \large r=xcos\theta+ysin\theta
    • 用参数(r,θ)霍夫空间,可以直接表示直线
      • 在霍夫空间中, 每一个点(r,θ)表示一条直线
      • 笛卡尔坐标系中, 以一定点(x0,y0)做的所有的线,在极坐标系中显示为一正弦曲线, 显然改变定点,即移动该曲线,
      • 极坐标中正弦曲线有m个交点, 即笛卡尔坐标系中m个共线的点
    • 用Angle和Distg来绘制一条hough曲线,一共绘制三条
    • 绘制的三条曲线交于一点(r0,θ0), 即该参数决定的直线, 有三个共线点
    • 直线检测实现
      • 显然我们可以把所有的像素点都利用hough变换转换到极坐标系中
      • 如果图片有几条直线, 那必然有很多像素点是共线的, 反映在极坐标中就是有几个点的颜色是非常深的
      • 提取这几个点,反变换到笛卡尔坐标系, 即找到直线
    • API
      • 标准霍夫变换: HoughLines从平面坐标转换到霍夫空间,返回(θ, r)
        • cv::HoughLines(

          InputArray src, // 输入图像,必须8-bit的灰度图像

          OutputArray lines, // 输出的极坐标来表示直线

          double rho, // 生成极坐标时候的像素扫描步长

          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

          ) // 一般情况是有经验的开发者使用,需要自己反变换到平面空间

      • 霍夫变换直线HoughLinesP,返回直线的两个点(x0,y0, x1,y1);
        • HoughLinesP(

          InputArray src, // 输入图像,必须8-bit的灰度图像

          OutputArray lines, // 输出的极坐标来表示直线

          double rho, // 生成极坐标时候的像素扫描步长,一般为1

          double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180

          int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线

          double minLineLength=0;// 最小直线长度

          double maxLineGap=0;// 最大间隔

          )

      • 步骤:

        • ​​​​​​​先边缘检测

        • ​​​​​​​再hough检测

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>

using namespace std;
using namespace cv;
int main(int argc, char ** argv)
{
	Mat src, dst;
	src = imread("C:\\Users\\xujin\\Desktop\\test1.JPG");
	if (!src.data)
	{
		cout << "no image";
		return -1;
	}
	namedWindow("src_imgae", WINDOW_AUTOSIZE);
	namedWindow("src_gray_imgae", WINDOW_AUTOSIZE);
	namedWindow("dst_imgae", WINDOW_AUTOSIZE);
	imshow("src_image", src);
	Mat src_gray;
	Canny(src, src_gray, 100, 200);
	imshow("src_gray_image", src_gray);
	cvtColor(src_gray, dst, CV_GRAY2BGR);
	
	vector<Vec4f>plines;
	HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 5);
	Scalar color = Scalar(0, 0, 255);
	for (size_t i = 0; i < plines.size(); i++)
	{
		Vec4f hline = plines[i];
		line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 1, LINE_AA);
	}
	imshow("dst_image", dst);
	waitKey(0);
	return 0;
}
发布了19 篇原创文章 · 获赞 2 · 访问量 7808

猜你喜欢

转载自blog.csdn.net/Mrsherlock_/article/details/104813180