VC实现Hough变换原理检测图像中的直线代码
Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。
帮同学看的一个代码,对霍夫直接不懂,下面的代码是我从其他程序中扒出来的,原本是检测2条最长的直线,设定2个最大值循环检测,我修改成用数组来遍历实现指定数目直线的检测。希望对大家有用。
/*************************************************************************
* 函数名称:
* HoughTrans()
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lmageWidth - 源图像宽度(象素数,必须是4的倍数)
* LONG lmageHeight - 源图像高度(象素数)
* 返回值:
* BOOL - 运算成功返回TRUE,否则返回FALSE。
* 说明:
* 该函数用于对检测图像中的指定数目的直线。
* 要求目标图像为只有0和255两个灰度值的灰度图像。
************************************************************************/
BOOL HoughTrans(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight)
{
// 指向源图像的指针
unsigned char* lpSrc;
// 指向要复制区域的指针
unsigned char* lpDst;
// 指向变换域的指针
unsigned char* lpTrans;
// 指向复制图像的指针
LPBYTE lpImage;
//指向变换域的指针
LPBYTE lptransImage;
//变换域的尺寸
int mMaxDist;//长度
int mMaxAngleNumber;//角度
//变换域的坐标
int mDist;
int mAngleNumber;
//循环变量
int i;
int j;
int q;
//像素值
unsigned char pixel;
//临时像素变量
unsigned char pixeltemp;
//直线数组
int mMaxPoint;
mMaxPoint = 5;
//存储变换域中的最大值
MaxValue MaxValue[5];
lpImage = (LPBYTE) new char[lmageWidth*lmageHeight];
// 判断是否内存分配失败
if (lpImage == NULL)
{
// 分配内存失败
return FALSE;
}
// 初始化新分配的内存,设定初始值为255
lpDst = (unsigned char *)lpImage;
memset(lpDst, (BYTE)255, lmageWidth*lmageHeight);
//计算变换域的尺寸
//最大距离
mMaxDist = (int) sqrt(lmageWidth*lmageWidth + lmageHeight*lmageHeight);
//角度从0-180,每格2度
mMaxAngleNumber = 90;
//为变换域分配内存
lptransImage = (LPBYTE) new int[lmageWidth*lmageHeight];
if (lptransImage == NULL)
{
// 分配内存失败
return FALSE;
}
// 初始化新分配的内存,设定初始值为255
lpTrans = (unsigned char *)lptransImage;
memset(lpTrans, 0, lmageWidth*lmageHeight);
//如果图像不是二值图像,转化为二值图像
for(j = 0; j = 120)
{
*lpSrc=(unsigned char)255;
}
else
{
*lpSrc=(unsigned char)0;
}
pixel = (unsigned char)*lpSrc;
//如果是黑点,则在变换域的对应各点上加1
if(pixel == 0)
{
//注意步长是2度
for(mAngleNumber=0; mAngleNumber=MaxValue[q].Value)
{
MaxValue[q].Value = (int)*(lptransImage+mDist*mMaxAngleNumber+mAngleNumber);
MaxValue[q].Dist = mDist;
MaxValue[q].AngleNumber = mAngleNumber;
}
}
}
//将最大值点附近清零
for (mDist = -9;mDist < 10;mDist++)
{
for(mAngleNumber=-1; mAngleNumber<2; mAngleNumber++) { if(mDist+MaxValue[q].Dist>=0 && mDist+MaxValue[q].Dist=0 && mAngleNumber+MaxValue[q].AngleNumber<=mMaxAngleNumber)
{
*(lptransImage+(mDist+MaxValue[q].Dist)*mMaxAngleNumber+\
(mAngleNumber+MaxValue[q].AngleNumber))=0;
}
}
}
}
for(j = 0; j
==============
对数组长度控制 检测图像中直线的条数。