public class Hough
{
public void TraceBeeline(Bitmap b)
{
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;//该图像每一行的宽度,跨距宽度。获取或设置 Bitmap 对象的跨距宽度(也称为扫描宽度)。
System.IntPtr Scan0 = bmData.Scan0;要检测的位图中第一个扫描行的位置,获取或设置位图中第一个像素数据的地址。它 也可以看成是位图中的第一个扫描行。
b.UnlockBits(bmData);
Bitmap newb = new Bitmap(b);//根据b新建一个Bitmap
BitmapData newbmData = newb.LockBits(new Rectangle(0, 0, newb.Width, newb.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
System.IntPtr Scan1 = newbmData.Scan0;//获取图像中第一个像素数据的地址
int nWidth = b.Width * 3; //因为每个象素点有rgb三种颜色的颜色值
int ImageHeight = b.Height;
int ImageWidth = b.Width;
unsafe//这是有指针的非安全代码
{
byte* p = (byte*)(void*)Scan0;
byte* destp = (byte*)(void*)Scan1;
int nOffset = stride - b.Width * 3;
int iMaxAngle = 90;
int iAngleNumber = 0;
//最大值
Maxvalue maxvalue = new Maxvalue();
//循环变量
int i;
int j;
int off = 0;
int iMaxDistance = 0, iDistance = 0;
iMaxDistance = (int)Math.Sqrt(nWidth * nWidth + ImageHeight * ImageHeight);
int[,] lpTrans = new int[iMaxDistance, iMaxAngle];
//去掉孤立点
for (j = 1; j < ImageHeight - 1; j++)
for (i = 1; i < nWidth - 1; i++)
{
off = j * nWidth + i;
if (1 == p[off])//1应该为白色\],即是去掉白色孤立点
{
if (p[off - 3] == 0 && p[off + 3] == 0 && p[off - nWidth] == 0 && p[off + nWidth] == 0 && p[off - nWidth - 3] == 0 && p[off - nWidth + 3] == 0 && p[off + nWidth - 3] == 0 && p[off + nWidth + 3] == 0)
p[off] = 0;
}
}
//////////////////////////////
for (j = 0; j < ImageHeight; j++)
for (i = 0; i < nWidth; i++)
{
off = j * nWidth + i;
if (1 == p[off])
{
for (iAngleNumber = 0; iAngleNumber < iMaxAngle; iAngleNumber++)
{
iDistance = (int)Math.Abs(i * Math.Cos(iAngleNumber * 2 * Math.PI / 180.0) + j * Math.Sin(iAngleNumber * 2 * Math.PI / 180.0));
if (iDistance >= 0 && iDistance < iMaxDistance)
lpTrans[iDistance, iAngleNumber]++;
}
}
}
//找到最大值
for (i = 0; i < iMaxDistance; i++)
for (iAngleNumber = 0; iAngleNumber < iMaxAngle; iAngleNumber++)
{
if (lpTrans[i, iAngleNumber] > maxvalue.iMax)
{
maxvalue.iMax = (int)lpTrans[i, iAngleNumber];//峰值
maxvalue.iAngle = iAngleNumber;//角度
maxvalue.iDist = i;//距离
}
}
//
for (j = 0; j < ImageHeight; j++)
for (i = 0; i < nWidth; i++)
{
off = j * nWidth + i;
iDistance = (int)Math.Abs(i * Math.Cos(iAngleNumber * 2 * Math.PI / 180.0) + j * Math.Sin ((iAngleNumber * 2 * Math.PI / 180.0));
if (iDistance == maxvalue.iMax)
destp[off] = 1;
else destp[off] = 0;
}
}
newb.UnlockBits(bmData);
}
public class Maxvalue
{
public int iDist;//距离
public int iAngle;//角度
public int iMax;//峰值
}
代码是一个关于HOUGH检测直线的代码
我把一个BITMAP型的图b作为参数代进去 语句都运行了 就是没反应 不知道怎么回事 请大家帮忙看下代码 看看有啥问题
我现在疑惑的是:
检测出来的直线是直接现在在原图上还是要重新绘图