在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜 率为无穷大)。所以实际应用中,是采用参数方程p=x*cos(theta)+y*sin(theta)。这样,图像平面 上的一个点就对应到参数p—theta平面上的一条曲线上。其它的还是一样。Hough变换求取直线的源码:
- //提取直线 能够在二值图像中提取场地中的白线,并进行重建
- //采用Hough变换
- #include <iostream>
- #include<cv.h>
- #include <highgui.h>
- #include <math.h>
- #define PI 3.1415926
- using namespace std;
- int main(){
- IplImage * image,*image2;
- image = cvLoadImage("E:\\image\\game\\board.bmp",0);
- cvNamedWindow("image",1);
- cvShowImage("image",image);
- //Hough变换
- //用Hough提取出所有的直线,并在一张新图中进行绘制
- image2 = cvCreateImage(cvSize(image->width,image->height),image->depth,1);
- int i,j;
- unsigned char *ptr,* dst;
- //参数空间的参数 角度0~度 每格2度 distance = fabs(x*cosA + y *sinA)
- double angle;
- int distance;
- int PerAngle = 2;
- int m,n;
- int AngleNum = 90; //角度范围0~360度
- int maxDistance = (int)(sqrt(pow((double)image->width,2)+ pow((double)image->height,2)) + 2 );
- //cout<<maxDistance<<endl;
- //参数空间各个点的统计值,使用一维数组,排序方便
- //申请一块内存,存放各个直线的出现次数
- int * number = new int [AngleNum * maxDistance];
- double Hsin,Hcot;
- int count = 0;