VC实现Hough变换原理检测图像中的直线代码

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 

==============
对数组长度控制 检测图像中直线的条数。

留下回复