首页
登录 | 注册

【2】opencv学习之霍夫变换(Hough)

霍夫变换(Hough)是一个非常重要的检测间断点边界形状的方法。它通过将图像坐标空间变换到参数空间,来实现直线与曲线的拟合。

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

  • 第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
  • 第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量【2】opencv学习之霍夫变换(Hough)
    表示,其中,【2】opencv学习之霍夫变换(Hough)
    是离坐标原点((0,0)(也就是图像的左上角)的距离。 【2】opencv学习之霍夫变换(Hough)
    是弧度线条旋转角度(0~垂直线,π/2~水平线)。
  • 第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。PS:Latex中/rho就表示 【2】opencv学习之霍夫变换(Hough)
  • 第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  • 第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
  • 第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。

opencv实例代码


#include "stdafx.h"
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

Mat srcImage, srcImage1, midImage, dstImage;

int main()
{
	srcImage1 = imread("1.jpg");
	//图片缩放
	resize(srcImage1, srcImage, Size(srcImage1.cols / 2, srcImage1.rows / 2),(0,0),(0,0),3);
	//边缘检测
	Canny(srcImage, midImage, 50, 200, 3);
	//灰度变换
	cvtColor(midImage, dstImage, CV_GRAY2BGR);
	
	vector<Vec2f>lines;//定义矢量结构存放得到的线段矢量集合
	//霍夫变换
	HoughLines(
		midImage, //输入图像
		lines,//线条的输出矢量
		1, //搜索时进步尺寸的单位半径
		CV_PI / 180,//搜索时进步尺寸的单位角度
		150,//平面阈值参数,达到此值才可以被检测
		0,//进步尺寸rho的除数距离
		0//进步尺寸单位角度的除数距离
		);
	
	for (size_t i = 0; i < lines.size(); i++);
	{		
		int i = 0;
		float rho = lines[i][0], theta = lines[i][1];
		Point pt1, pt2;
		double a = cos(theta), b = sin(theta);
		double x0 = a*rho, y0 = b*rho;
		pt1.x = cvRound(x0 + 1000 * (-b));
		pt1.y = cvRound(y0 + 1000 * (a));
		pt2.x = cvRound(x0 - 1000 * (-b));
		pt2.y = cvRound(y0 - 1000 * (a));
		line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
	}
	imshow("【原始图】", srcImage);
	imshow("【边缘检测后的效果图】", midImage);
	imshow("【效果图】", dstImage);
	waitKey(0);
    return 0;
}

 



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号