霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。霍夫变换于1962年由Paul Hough 首次提出[53],后于1972年由Richard Duda和Peter Hart推广使用[54],经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。
霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题,上一节中已经介绍了车道的直线特征,本节中给出hough变换检测直线在Opencv+VS2012平台下编写的结果及代码。
下面是全部代码:
原图:
// Hough.cpp : 定义控制台应用程序的入口点。
//霍夫变换检测
//yyx20125084014 姚永祥
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include<iostream>
#define PI 3.1415926
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
//【1】读取房子图像的原始图片
Mat image = imread ("C:\\fangzi.jpg");
Mat result;
cvtColor (image,result,CV_BGRA2GRAY);
Mat contours;
//边缘检测
Canny (result,contours,125,350);
vector<Vec2f> lines;
//霍夫变换,获得一组极坐标参数(rho,theta),每一对对应一条直线,保存到lines
HoughLines (contours,lines,1,PI/180,260); //第3,4个参数表示在(rho,theta)坐标系里横纵坐标的最小单位,即步长
vector<Vec2f>::const_iterator it = lines.begin ();
cout<<lines.size ()<<endl;
while(it != lines.end()){
float rho = (*it)[0];
float theta = (*it)[1];
if(theta<PI/4.||theta>3.*PI/4){
//画交点在上下两边的直线
Point pt1(rho/cos(theta),0);
Point pt2((rho-result.rows*sin(theta))/cos(theta),result.rows);
line(image,pt1,pt2,Scalar(255),1);
}
else {
//画交点在左右两边的直线
Point pt1(0,rho/sin(theta));
Point pt2(result.cols,(rho-result.cols*cos(theta)/sin(theta)));
line(image,pt1,pt2,Scalar(255),1);
}
++it;
}
//【2】建立输出窗口
namedWindow ("hough");
imshow("hough",image);
//【3】对霍夫曼边缘特征提取后的图片进行保存
imwrite ("C:\\Houghjiance.jpg",image );
waitKey (0);
return 0;
}
结果图: