| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 827 人关注过本帖
标题:HOUGH检测写的C#代码 出现问题
只看楼主 加入收藏
woyaoxuexi
Rank: 1
等 级:新手上路
帖 子:97
专家分:0
注 册:2006-11-7
收藏
 问题点数:0 回复次数:0 
HOUGH检测写的C#代码 出现问题

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作为参数代进去 语句都运行了 就是没反应 不知道怎么回事 请大家帮忙看下代码 看看有啥问题
我现在疑惑的是:
检测出来的直线是直接现在在原图上还是要重新绘图

搜索更多相关主题的帖子: 代码 HOUGH 检测 
2007-08-02 12:35
快速回复:HOUGH检测写的C#代码 出现问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039493 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved