HOUGH变换的VC代码.docx

上传人:b****4 文档编号:5282750 上传时间:2023-05-08 格式:DOCX 页数:8 大小:15.32KB
下载 相关 举报
HOUGH变换的VC代码.docx_第1页
第1页 / 共8页
HOUGH变换的VC代码.docx_第2页
第2页 / 共8页
HOUGH变换的VC代码.docx_第3页
第3页 / 共8页
HOUGH变换的VC代码.docx_第4页
第4页 / 共8页
HOUGH变换的VC代码.docx_第5页
第5页 / 共8页
HOUGH变换的VC代码.docx_第6页
第6页 / 共8页
HOUGH变换的VC代码.docx_第7页
第7页 / 共8页
HOUGH变换的VC代码.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

HOUGH变换的VC代码.docx

《HOUGH变换的VC代码.docx》由会员分享,可在线阅读,更多相关《HOUGH变换的VC代码.docx(8页珍藏版)》请在冰点文库上搜索。

HOUGH变换的VC代码.docx

HOUGH变换的VC代码

HOUGH变换的VC代码

BOOLWINAPIHoughDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight)

{

//指向源图像的指针

LPSTRlpSrc;

//指向缓存图像的指针

LPSTRlpDst;

//指向变换域的指针

LPSTRlpTrans;

//图像每行的字节数

LONGlLineBytes;

//指向缓存DIB图像的指针

LPSTRlpNewDIBBits;

HLOCALhNewDIBBits;

//指向变换域的指针

LPSTRlpTransArea;

HLOCALhTransArea;

//变换域的尺寸

intiMaxDist;

intiMaxAngleNumber;

//变换域的坐标

intiDist;

intiAngleNumber;

//循环变量

longi;

longj;

//像素值

unsignedcharpixel;

//存储变换域中的两个最大值

MaxValueMaxValue1;

MaxValueMaxValue2;

//暂时分配内存,以保存新图像

hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);

if(hNewDIBBits==NULL)

{

//分配内存失败

returnFALSE;

}

//锁定内存

lpNewDIBBits=(char*)LocalLock(hNewDIBBits);

//初始化新分配的内存,设定初始值为255

lpDst=(char*)lpNewDIBBits;

memset(lpDst,(BYTE)255,lWidth*lHeight);

//计算变换域的尺寸

//最大距离

iMaxDist=(int)sqrt(lWidth*lWidth+lHeight*lHeight);

//角度从0-180,每格2度

iMaxAngleNumber=90;

//为变换域分配内存

hTransArea=LocalAlloc(LHND,lWidth*lHeight*sizeof(int));

if(hNewDIBBits==NULL)

{

//分配内存失败

returnFALSE;

}

//锁定内存

lpTransArea=(char*)LocalLock(hTransArea);

//初始化新分配的内存,设定初始值为0

lpTrans=(char*)lpTransArea;

memset(lpTrans,0,lWidth*lHeight*sizeof(int));

//计算图像每行的字节数

lLineBytes=WIDTHBYTES(lWidth*8);

for(j=0;j

{

for(i=0;i

{

//指向源图像倒数第j行,第i个象素的指针

lpSrc=(char*)lpDIBBits+lLineBytes*j+i;

//取得当前指针处的像素值,注意要转换为unsignedchar型

pixel=(unsignedchar)*lpSrc;

//目标图像中含有0和255外的其它灰度值

if(pixel!

=255&&*lpSrc!

=0)

returnFALSE;

//如果是黑点,则在变换域的对应各点上加1

if(pixel==0)

{

//注意步长是2度

for(iAngleNumber=0;iAngleNumber

{

iDist=(int)fabs(i*cos(iAngleNumber*2*pi/180.0)+\

j*sin(iAngleNumber*2*pi/180.0));

//变换域的对应点上加1

*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber)=\

*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber)+1;

}

}

}

}

//找到变换域中的两个最大值点

MaxValue1.Value=0;

MaxValue2.Value=0;

//找到第一个最大值点

for(iDist=0;iDistMaxValue1.Value)

{

MaxValue1.Value=(int)*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber);

MaxValue1.Dist=iDist;

MaxValue1.AngleNumber=iAngleNumber;

}

}

}

//将第一个最大值点附近清零

for(iDist=-9;iDist=0&&iDist+MaxValue1.Dist=0&&iAngleNumber+MaxValue1.AngleNumber<=iMaxAngleNumber)

{

*(lpTransArea+(iDist+MaxValue1.Dist)*iMaxAngleNumber+\

(iAngleNumber+MaxValue1.AngleNumber))=0;

}

}

}

//找到第二个最大值点

for(iDist=0;iDistMaxValue2.Value)

{

MaxValue2.Value=(int)*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber);

MaxValue2.Dist=iDist;

MaxValue2.AngleNumber=iAngleNumber;

}

}

}//判断两直线是否平行

if(abs(MaxValue1.AngleNumber-MaxValue2.AngleNumber)<=2)

{

//两直线平行,在缓存图像中重绘这两条直线

for(j=0;j

{

for(i=0;i

{

//指向缓存图像倒数第j行,第i个象素的指针

lpDst=(char*)lpNewDIBBits+lLineBytes*j+i;

//如果该点在某一条平行直线上,则在缓存图像上将该点赋为黑

//在第一条直线上

iDist=(int)fabs(i*cos(MaxValue1.AngleNumber*2*pi/180.0)+\

j*sin(MaxValue1.AngleNumber*2*pi/180.0));

if(iDist==MaxValue1.Dist)

*lpDst=(unsignedchar)0;

//在第二条直线上

iDist=(int)fabs(i*cos(MaxValue2.AngleNumber*2*pi/180.0)+\

j*sin(MaxValue2.AngleNumber*2*pi/180.0));

if(iDist==MaxValue2.Dist)

*lpDst=(unsignedchar)0;

}

}

}

//复制腐蚀后的图像

memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);

//释放内存

LocalUnlock(hNewDIBBits);

LocalFree(hNewDIBBits);

//释放内存

LocalUnlock(hTransArea);

LocalFree(hTransArea);

//返回

returnTRUE;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2