现在的位置: 首页 > 综合 > 正文

学习opencv之Hough变换

2013年12月07日 ⁄ 综合 ⁄ 共 1814字 ⁄ 字号 评论关闭

  对于笛卡尔坐标系来说:y=ax+b,如果坐标上一点(x0,y0),则对应参数坐标(a0,b0),

 同理,如果在笛卡尔坐标系上一条直线(即有恒定的参数(a,b))上的点,在参数坐标上则会在(a,b)这点上相交。

一般来说我们可以通过设置直线上点的阈值(或者说是个数)来定义多少条曲线交于一点,这样我们才认为检测到一条直线。

hough线变换要做的就是追踪图像中的每个点对应曲线间的交点,如果交于一点的曲线的数量超过了设定的阈值,就认为交点所

代表的参数对(a,b)在原图像中为一条直线。

   

在opencv中有两种hough变换:

1、标准hough线变换  

      它能给我们提供参数对的集合来表示检测到的直线 用函数HoughLines(),它能给我们提供一组参数对的集合来表示检测到的直线

参数:

dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对  的容器 * rho : 参数极径  以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角  以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点

      

2、统计概率hough线变换

      它输出检测到的直线的端点(x0,y0,x1,y1)   用函数HoughLinesP(),她输出检测到的直线的端点

参数:

dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图) * lines: 储存着检测到的直线的参数对  的容器
rho : 参数极径  以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角  以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点 *
minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
maxLineGap: 能被认为在一条直线上的亮点的最大距离.

代码演示如下:

// 1.1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"opencv243.h"

using namespace std;
using namespace cv;

void houghlines(Mat dst,Mat cdst)
{
	vector<Vec2f> lines;
	HoughLines(dst,lines,1,CV_PI/180,200,0,0);//PI表示180度

	for(size_t i=0; i<lines.size(); i++)
	{
		float rho=lines[i][0],   theta=lines[i][1];

		Point pt1,pt2;

		double a=cos(theta),   b=sin(theta);

		double x0=rho*a,       y0=rho*b;

		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(cdst,pt1,pt2,Scalar(0,0,255),1,CV_AA);

	}
}

void houghlinesp(Mat dst,Mat cdst)
{
	vector<Vec4i> lines;
	HoughLinesP(dst,lines,1,CV_PI/180,50,50,10);
	for(size_t i=0;i<lines.size();i++)
	{
		Vec4i L=lines[i];
		
		line(cdst,Point(L[0],L[1]),Point(L[2],L[3]),Scalar(0,0,255),1,CV_AA);

	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	Mat src=imread("C:\\Users\\sony\\Desktop\\shi.jpg",0);
	if(src.empty())
	{
		cout<<"file erro !"<<endl;
	}
	Mat dst,cdst;
	Canny(src,dst,50,200,3);
	cvtColor(dst,cdst,CV_GRAY2BGR);

	houghlinesp(dst,cdst);

	imshow("source",dst);
	imshow("detected lines",cdst);

	waitKey(0);


	return 0;
}

抱歉!评论已关闭.