实验思路
通过将垂直投影与一维滤波相减与一阈值比较来记录LR,找到LR的中点即为可能存在于行道线上的点,将这些点进行霍夫变换,得到一条落点最多的极坐标曲线,即为行道线所在的线。
实验代码
- 计算投影:
void CalProj(BYTE *pImg, int width, int height,int *projOrg)
{
int realHeight = height / 15;
int x, y;
BYTE *pRow, *pCol;
memset(projOrg, 0, sizeof(int)*width);
for(pRow=pImg, y=0;y<realHeight;y++,pRow++)
for (x = 0, pCol = pRow; x < width; x++, pCol++)
{
projOrg[x] += *pCol;
}
for (x = 0; x < width; x++)
{
projOrg[x] /= realHeight;
}
}
因为要将将图像分块处理,所以计算时只能计算一部分的投影,将每列相加后归一 化即得到垂直投影图。
2. 一维均值滤波
void AverFilter(int *pData, int width,int windowLength,int *pResult)
{
int i, j, sum;
int halfWindow = windowLength / 2;
memset(pResult, 0, sizeof(int)*width);
for (i = halfWindow; i <= width - halfWindow; i++)
{
sum = 0;
for (j = i - halfWindow; j <= i + halfWindow; j++)
{
sum += pData[j];
}
pResult[i] = sum / windowLength;
}
}
这里直接将窗口内求平均然后赋值,然后用垂直投影图减去滤波后的投影图,对这个图求阈值
3. Otsu求阈值
int Otsu(int *hist)
{
int threshold;
int gmin,gmax;
gmin = 0;
gmax = 256;
int sum