Hough变换检测圆坐标源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hough变换检测圆坐标源代码
HOUHG 变换检测圆坐标源代码(原创)
我们用HOUGH检测直线的时候是两个未知量,因为轴半径和相角可以确定一条直线,在HOUGH域出现累计最大点就可能是原域中的直线。

现在回到圆的检测上来,确定一个圆需要什么:X坐标,Y坐标,半径三个未知量吧,好了,现在,你做一个三维空间的HOUGH域,以这三个未知量作为三个轴,现在按照一定步长进行三重循环,在最内层循环是这样的,X,Y确定,以不同的半径进行搜索,如果你的X,Y 刚好就是实际图像的X,Y处,半径又搜索到实际真实的半径,那么是不是在这个三维空间
e-
mail :bigwangenglish@/doc/5912227014. html,
void HoughCircle(){
/*原图数据区指针宽= 100 高= 100 ,二值灰白图片(只有0 和255)*/
BYTE gData_Buff[100*100*3];
/*宽= 100*/
int wide = 100;
/* 高= 100*/
int height = 100;
unsigned char * m_temp;
m_temp=new unsigned char [wide*height];
/*中间变量*/
int i,j,cx,cy1,cy2;
memset(m_temp,0,sizeof(m_temp));
/*以离散点位中心画圆*/
for(i=0;i<wide*height;i++)< p="">
m_temp[i]=0;
/* 计数数组,图象上的每一个像素点对应一个计数值,用来确定该点是否是某个圆的圆心。

*/
int* pCount;
/* X坐标数组,其中的元素是圆环上点的X坐标。

*/
int* ixCor;
/* Y坐标数组,其中的元素是圆环上点的Y坐标。

*/
int* iyCor;
int* ixCalCor;
int* iyCalCor;
int iPointNum;
int ixBegin, iyBegin;
int iMinRadius;
int iMaxRadius;
int iRadius;
int iNumOfCircle;
iMinRadius = 16; /* 要检测的圆环的内半径*/
/* 要检测的圆环的外半径,即圆环的检测宽度为3,像素在这个圆环内,都视作圆上的*/ iMaxRadius = 18;
int Count1;
Count1 = 0;
for (i=iMinRadius;i<=iMaxRadius;i++){
Count1 +=i;
}
/* 圆环上点的个数? 2*PI*16 + 2*PI*15 + 2*PI*14 =2*3.14*45 = 282 ,每个点占4个字节,共8*3.14*45 = 1128个字节*/ iPointNum = (int)( 8 * 3.14 * Count1 * 1.5 );
/* 图像上的每一个像素对应一个计数值。

pCount指针指向存放图像中各个像素点的计数值的内存块*/
pCount = (int*)malloc(height*wide*sizeof(int));
for ( i = 0; i < height*wide*3; i++ )
pCount[i] = 0; // 各个像素点的初始计数都设为0*/
}
ixCor = (int*)malloc( iPointNum * sizeof(int) );
iyCor = (int*)malloc( iPointNum * sizeof(int) ); /* ixCor指针和iyCor指针指向存放圆环上像素点的坐标的内存块*/
ixCalCor = (int*)malloc( iPointNum * sizeof(int) );
iyCalCor = (int*)malloc( iPointNum * sizeof(int) ); /* ixCalCor 指针和iyCalCor指针指向存放图像中其他同样大小的圆环上像素点的坐标的内存块*/
for ( i = 0; i < iPointNum; i++ )
{
ixCor[i] = 0;
iyCor[i] = 0;
ixCalCor[i] = 0;
iyCalCor[i] = 0; /* 坐标全部初始化为0*/
}
ixBegin = iMaxRadius; /* 初始圆心的X坐标*/
iyBegin = iMaxRadius; /* 初始圆心的y坐标*/
/* 功能:检测初始圆环。

/* 具体说明:把以(ixBegin, iyBegin)为圆心,宽度为3,外半径为iMaxRadius,*/
/* 内半径为iMinRadius的圆环上的元素的x,y坐标放到数组ixCor和iyCor 中。

*/
iNumOfCircle = 0; // 圆环上的象素点个数初始为0
for ( iRadius = iMinRadius; iRadius <= iMaxRadius; iRadius++ ) /* iRadius为圆的半径*/
{
for ( i = iyBegin - iRadius; i <= iyBegin + iRadius; i++ ) /* i 为圆内像素点的X坐标*/
for ( j = ixBegin - iRadius; j <= ixBegin + iRadius; j++ ) /* j 为圆内像素点的Y坐标*/
{
// 若(i,j)在以(ixBegin, iyBegin)为圆心, 以iRadius为半径的圆环上*/
if ( abs( (j-ixBegin)*(j-ixBegin) + (i-iyBegin)*(i-iyBegin) - iRadius*iRadius ) < 10) /* 圆的方程:(X-X0)*(X-X0) + (Y-Y0)*(Y-Y0) = R*R*/
{
iyCor[iNumOfCircle] = i;
ixCor[iNumOfCircle] = j; /* 把圆环上点的x、y坐标分别放到数组iyCor和ixCor中*/
iNumOfCircle++; /* 圆环上像素点的个数,也是圆环上的当前点在数组iyCor和ixCor中的序号*/
}
}
}
}
/* 功能:检测整个图像范围内同样大小的圆环。

不检测圆心在靠近图像边界附近的圆。

*/
/* 具体说明:在整个图像范围内平移圆环,同时检测圆环上像素值为255的象素点,*/
/* 每检测到一个这样的点,则将该圆的圆心点对应的计数器值加1。

*/
/* (j, i)是圆心坐标*/
int n=0;
for ( i = iMaxRadius; i < height - iMaxRadius; i+=2) /* 圆心位置的y坐标变动范围*/ {
for ( j = iMaxRadius; j < wide - iMaxRadius; j+=2 )/* 圆心位置
的x坐标变动范围*/
{
for ( n = 0; n < iNumOfCircle; n++ ) /* 对于初始圆环上的每个点,在图像上进行平移,平移距离从1个像素开始,逐步递增*/ {
iyCalCor[n] = iyCor[n] + ( i - iMaxRadius ); /* 平移后的圆环上的点的X坐标*/
ixCalCor[n] = ixCor[n] + ( j - iMaxRadius ); /* 平移后的圆环上的点的X坐标*/
}
for ( n = 0; n < iNumOfCircle; n+=2) /* 对圆环上的点进行操作*/
{
/* 在把图像从文件读到内存中时,已经把每行末尾可能添加的0跳过了。

*/
if ( *(gData_Buff+iyCalCor[n]*wide*3+ixCalCor[n]*3) == 0 ) {
pCount[i*wide+j]++; /* 则此圆环的圆心(j,i)对应的计数值应该增加1。

*/
/* 此计数值表示以(j,i)为圆心,以14~16为半径的圆上落有多少个白点*/
/* 计数值越高表示,这个圆环上落的白点越多,表明这些白点组成的图形越象一个圆。

*/
}
}
}
}
/*通过求最大值计算出圆心位置*/
int nMaxV alue=0;
int nMaxX,nMaxY;
for (j=0;j<height;j++)< p=""> {
for (i=0;i<wide;i++)< p="">
{
if (pCount[j*wide+i] > nMaxV alue) {
nMaxV alue = pCount[j*wide+i]; nMaxX = i; /* 圆的高坐标*/ nMaxY = j; /* 圆的宽坐标*/
}
}
}
/*释放内存*/
free(pCount);
free(ixCor);
free(iyCor);
free(ixCalCor);
free(iyCalCor);
delete [] m_temp; }
</wide;i++)<>
</height;j++)<>
</wide*height;i++)<>。

相关文档
最新文档