hough检测直线

时间:2008-05-13 23:40:05   来源:论坛整理  作者:  编辑:chinaitzhe
如何用HOUGH检测直线并获取直线的起点终点坐标
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



hough检测直线



typedef struct MAXVALUE{

 int iDist;

 int iAngle;

 int iMax;

}MAXVALUE;



/*

 * 检测直线

 */

void TraceBeeline(int ImageWidth,int ImageHeight,LPBYTE lpSrc,LPBYTE lpDest,int len)

{

// #define pi 3.1415927

 int iMaxAngle = 90;

 int iAngleNumber = 0;

 //最大值

 MAXVALUE MaxValue1;

 memset(&MaxValue1,0,sizeof(MAXVALUE));

 //循环变量

 int i;

 int j;

 int off = 0;

 int iMaxDistance = 0,iDistance = 0;

 iMaxDistance = (int)sqrt(ImageWidth * ImageWidth   ImageHeight * ImageHeight);

 int  *lpTrans = new int[iMaxDistance * iMaxAngle];

 memset(lpTrans,0,iMaxDistance * iMaxAngle * sizeof(int));

    //去掉孤立点

    for(j=1,off=0;j<ImageHeight-1;j  )

  for(i=1;i<ImageWidth-1;i  ,off)

  {

   if(1==lpSrc[off])

   {

    if(lpSrc[off-1]==0&&lpSrc[off 1]==0&&lpSrc[off-ImageWidth]==0&&lpSrc[off ImageWidth]==0 /

     lpSrc[off-ImageWidth-1]==0&&lpSrc[off-ImageWidth 1]==0&&lpSrc[off ImageWidth-1]==0&&lpSrc[off ImageWidth 1]==0)

     lpSrc[off]=0;

   }

  }

 //////////////////////////////



 for(j=0;j<ImageHeight;j  )

  for(i=0;i<ImageWidth;i  )

  {

   off = j * ImageWidth   i;

   if(1==lpSrc[off])

   {

    for(iAngleNumber=0;iAngleNumber<iMaxAngle;iAngleNumber  )

    {

     iDistance = (int)fabs(i * cos(iAngleNumber * 2 * PI/180.0)   j * sin(iAngleNumber * 2 * PI/180.0));

     if(iDistance>=0&&iDistance<iMaxDistance)

         lpTrans[iDistance * iMaxAngle   iAngleNumber]  ;

    }

   }

  }



 //找到最大值

  for(i = 0;i < iMaxDistance;i  )

   for(iAngleNumber=0;iAngleNumber<iMaxAngle;iAngleNumber  )

   {

    if(lpTrans[i * iMaxAngle   iAngleNumber]>MaxValue1.iMax)

    {

     MaxValue1.iMax = (int)lpTrans[i * iMaxAngle   iAngleNumber];

                    MaxValue1.iAngle = iAngleNumber;

     MaxValue1.iDist = i;

    }

   }



 //  



   for(j=0;j<ImageHeight;j  )

    for(i=0;i<ImageWidth;i  )

    {

     off = j * ImageWidth   i;

                    iDistance = (int)fabs(i * cos(iAngleNumber * 2 * PI/180.0)   j * sin(iAngleNumber * 2 * PI/180.0));

     if(iDistance == MaxValue1.iMax)

      lpDest[off]=1;

    }





 if(lpTrans)

 {

  delete lpTrans;

  lpTrans = NULL;

 }

}


网友回复: 请问有hough变换检测圆和椭圆的程序吗?
网友回复:对答案满足的话就结贴吧!
网友回复:但是直线起点和终点的坐标怎么表示呢,主要就是这个问题,我检测出来的直线坐标总是不对。
网友回复:HOUGH只是检测经过某些点的直线的方程,至于什么是起点和什么是终点,只要你检测出来以后,判定那条直线上最远的点即可。

至于椭圆和圆,其方程对于参数而言都是线性的,因此似乎可以当作直线求解。注重:所谓检测直线,是对“参数”而言,而不是“坐标”而言。只要方程满足f1(x,y)a f2(x,y)b ... fn(x,y)c=0,都可以看作对参数的直线方程,而对fi(x,y)是否直线无关

楼主要想不弄明白原理就搞出答案来,那不轻易哦,因为除非有现成的,谁会去帮你写这么复杂的程序呢?

网友回复:其实大体的程序是有的,只是检测直线的时候发现坐标起始点不太对,不知道是什么地方出问题了,不过还是要感谢各位了,
网友回复:其实自己有编程序的,就是发现最后计算出来的起点和终点坐标不对,就是想问问是怎么个思路,呵呵,自己再试试吧,谢谢大家了
关键字:hough,检测,直线,
上一篇:祝福灾区

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面