二值图像跟踪曲线程序

稍后提交一个完整的测试程序

  1 None.gif
  2 None.gifBOOL WINAPI TraceDIB(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,CArray < CPoint,CPoint >*  pPoint,CArray < int , int >*  pSlope)
  3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
  4InBlock.gif// 指向源图像的指针
  5InBlock.gifBYTE*lpSrc;
  6InBlock.gif
  7InBlock.gif// 指向缓存图像的指针
  8InBlock.gifBYTE*lpDst;
  9InBlock.gif
 10InBlock.gif// 指向缓存DIB图像的指针
 11InBlock.gifBYTE*lpNewDIBBits;
 12InBlock.gifHLOCALhNewDIBBits;
 13InBlock.gif
 14InBlock.gif// 图像每行的字节数
 15InBlock.gifLONG lLineBytes=WIDTHBYTES(lWidth * 8);
 16InBlock.gif
 17InBlock.giflong i,j;
 18InBlock.gifDWORD ii=0;
 19InBlock.gif
 20InBlock.gifBYTE pixel;
 21InBlock.gifbool bFindStartPoint;
 22InBlock.gif
 23InBlock.gif//是否扫描到一个边界点
 24InBlock.gifbool bFindPoint;
 25InBlock.gif
 26InBlock.gif
 27InBlock.gif//起始边界点与当前边界点
 28InBlock.gifCPoint StartPoint,CurrentPoint;
 29InBlock.gif    //顺时针方向
 30ExpandedSubBlockStart.gifContractedSubBlock.gifint Direction[8][2]=dot.gif{dot.gif{1,0},dot.gif{1,-1},dot.gif{0,-1},dot.gif{-1,-1},dot.gif{-1,0},dot.gif{-1,1},dot.gif{0,1},dot.gif{1,1}};
 31InBlock.gifint BeginDirect;
 32InBlock.gif
 33InBlock.gifhNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
 34InBlock.gifif (hNewDIBBits == NULL)
 35ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 36InBlock.gif// 分配内存失败
 37InBlock.gifreturn FALSE;
 38ExpandedSubBlockEnd.gif}

 39InBlock.giflpNewDIBBits = (BYTE* )LocalLock(hNewDIBBits);
 40InBlock.gif// 初始化新分配的内存,设定初始值为255
 41InBlock.giflpDst = (BYTE*)lpNewDIBBits;
 42InBlock.gifmemset(lpDst, (BYTE)255, lLineBytes * lHeight);
 43InBlock.gif
 44InBlock.gif
 45InBlock.gif//先找到最左下方的边界点
 46InBlock.gifbFindStartPoint = false;
 47InBlock.giffor (j = 0;j < lHeight && !bFindStartPoint;j++)
 48ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 49InBlock.giffor(i = 0;i < lWidth && !bFindStartPoint;i++)
 50ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 51InBlock.gif// 指向源图像倒数第j行,第i个象素的指针
 52InBlock.giflpSrc = (BYTE *)lpDIBBits + lLineBytes * j + i;
 53InBlock.gif
 54InBlock.gifpixel = (BYTE)*lpSrc;
 55InBlock.gif
 56InBlock.gifif(pixel == 0)
 57ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 58InBlock.gifbFindStartPoint = true;
 59InBlock.gif
 60InBlock.gifStartPoint.y = j;
 61InBlock.gifStartPoint.x = i;
 62InBlock.gif
 63InBlock.gif// 指向目标图像倒数第j行,第i个象素的指针
 64InBlock.giflpDst = (BYTE *)lpNewDIBBits + lLineBytes * j + i;
 65InBlock.gif*lpDst = (BYTE)0;
 66ExpandedSubBlockEnd.gif}

 67ExpandedSubBlockEnd.gif}

 68ExpandedSubBlockEnd.gif}

 69InBlock.gif
 70InBlock.gif//由于起始点是在左下方,故起始扫描沿左上方向
 71InBlock.gifBeginDirect = 5;
 72InBlock.gif//跟踪边界
 73InBlock.gifbFindStartPoint = false;
 74InBlock.gif//从初始点开始扫描
 75InBlock.gifCurrentPoint.y = StartPoint.y;
 76InBlock.gifCurrentPoint.x = StartPoint.x;
 77InBlock.gifpPoint->Add(CurrentPoint);
 78InBlock.gif// 第一个点的斜率为2 
 79InBlock.gifpSlope->Add(int(2));
 80InBlock.gifii++;
 81InBlock.gif
 82InBlock.gifwhile(!bFindStartPoint)
 83ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 84InBlock.gifbFindPoint = false;
 85InBlock.gifwhile(!bFindPoint)
 86ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 87InBlock.gif//沿扫描方向查看一个像素
 88InBlock.giflong offset = lLineBytes * ( CurrentPoint.y + Direction[BeginDirect][1])
 89InBlock.gif+ (CurrentPoint.x + Direction[BeginDirect][0]);
 90InBlock.giflpSrc = (unsigned char *)lpDIBBits + offset;
 91InBlock.giflpDst = (unsigned char *)lpNewDIBBits + offset;
 92InBlock.gifpixel = (unsigned char)*lpSrc;
 93InBlock.gif
 94InBlock.gifif(pixel == 0&&(unsigned char)*lpDst==255)
 95ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 96InBlock.gifbFindPoint = true;
 97InBlock.gifCurrentPoint.y = CurrentPoint.y + Direction[BeginDirect][1];
 98InBlock.gifCurrentPoint.x = CurrentPoint.x + Direction[BeginDirect][0];
 99InBlock.gifpPoint->Add(CurrentPoint);
100InBlock.gif
101InBlock.gif// s = BeginDirect%4;
102InBlock.gif//if(s==3)
103InBlock.gif//s = -1;
104InBlock.gif                //左上方代表方向的5,以后按照
105InBlock.gifpSlope->Add(BeginDirect);//s;
106InBlock.gifii++;
107InBlock.gif*lpDst = (unsigned char)0;
108InBlock.gif//扫描的方向逆时针旋转两格
109InBlock.gifBeginDirect--;
110InBlock.gifif(BeginDirect == -1)
111InBlock.gifBeginDirect = 7;
112InBlock.gifBeginDirect--;
113InBlock.gifif(BeginDirect == -1)
114InBlock.gifBeginDirect = 7;
115ExpandedSubBlockEnd.gif}

116InBlock.gifelse
117ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
118InBlock.gifif(pixel!=0)
119ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
120InBlock.gif//扫描方向顺时针旋转一格
121InBlock.gifBeginDirect++;
122InBlock.gifif(BeginDirect == 8)
123InBlock.gifBeginDirect = 0;
124ExpandedSubBlockEnd.gif}

125ExpandedSubBlockStart.gifContractedSubBlock.gifelsedot.gif{
126InBlock.gif// 扫描到以扫过的点
127InBlock.gifbFindPoint = true;
128InBlock.gifbFindStartPoint = true;
129ExpandedSubBlockEnd.gif}

130ExpandedSubBlockEnd.gif}

131InBlock.gif
132ExpandedSubBlockEnd.gif}

133ExpandedSubBlockEnd.gif}

134InBlock.gif
135InBlock.gifASSERT(pPoint->GetSize()==ii);
136InBlock.gif
137InBlock.gif// 复制腐蚀后的图像
138InBlock.gifmemcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
139InBlock.gif
140InBlock.gif// 释放内存
141InBlock.gifLocalUnlock(hNewDIBBits);
142InBlock.gifLocalFree(hNewDIBBits);
143InBlock.gif
144InBlock.gif// 返回
145InBlock.gifreturn TRUE;
146ExpandedBlockEnd.gif}

147 None.gif
148 None.gif

转载于:https://www.cnblogs.com/missparad/archive/2005/05/11/153383.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值