void CPatternrecognitionDlg::SharpAngle(IplImage *pImage)//, CvPoint AnglePointPosition[])
 
{ 

 SharpAngle_Num=0;  

    int lWidth,lHeight; 

 unsigned char *lpimage,*lpSrc; 

 int i,j,m; 

    //边界扫描的方向数目计数 

 int DirectSum1; 

 int DirectSum2; 

    //扫描中的临时宽(从左往右) 

 int tempW; 

    //扫描中的临时高(从上往下) 

 int tempH; 

 //扫描到的连续目标白点计数 

 int Count=0;   

 //用于尖角顶点判定条件(起始扫描点设为左、右两个边界点,左右可以重合为一个点) 

    //条件一:首先必须是顶点(尖或广义平尖角,即该点上方无目标白点) 

 int FindTopPoint1=0; 

    //条件二:如果是广义平尖角即同一行有几个连续的目标白点,则这个连续目标白点个数必须小于阈值 

 int FindTopPoint2=0; 

 //尖角顶点的起始点和结束点下标 

 int TopPointFirst=0, TopPointEnd=0;  

 //左右边界点下标(横坐标)及其相隔点数 

 int ColumnL, ColumnR, BounderSpaceNum; 

 //尖角左右边界交点的纵坐标,及尖角高度(用这两个条件判断尖角) 

 int RowSumL,RowSumR;//左右边界方向,扫描的行数  

 //用标记法跟踪扫描的5个方向//注意扫描图像时从上往下进行 

 int Direction1[2][2]={{1,-1},{1,0}}; 

    int Direction2[2][2]={{1,0},{1,1}}; 

 //(指向排列的图像数据) 

 lpimage=(uchar *)pImage->imageData; 

 lWidth=pImage->width;    

 lHeight=pImage->height; 

 //平尖角阈值,现在设为整幅图宽度的5% 

 int PlainAngleThreshold=16; 

 for(j=0;j<lHeight;j++) 

 { 

  i=0; 

  while(i<lWidth) 

  { 

   Count=1; 

   lpSrc=lpimage+(j*lWidth+i); 

            //当前点为目标白点 

   if(*lpSrc==255.0) 

   { 

     if(j>0) 

     { 

    //看当前目标白点上方小区域是否也为目标白点 

    for(m=-4;m<=4;m++)  

    {    

     //防止地址越界 

     if((0<=(i+m)) && ((i+m)<lWidth)) 

     { 

      //lpSrc为目标白点的上一行左右m个点,判断是否有白点存在 

      lpSrc=lpimage+((j-1)*lWidth+i+m); 

         //若当前检测点上方小区域有目标白点,则非尖角顶点,退出顶点检测 

      if(*lpSrc==255.0)   

         break;   

     } 

    } 

    if(m<=4)   

     FindTopPoint1=0;//尖角顶点判定条件1为非 

    else 

    { 

     FindTopPoint1=1; 

                    //找到一个尖角顶点,起始点 

     TopPointFirst=i; 

    } 

     } 

     else 

                  FindTopPoint1=1;//end of if(j>0) 

   } 

   else   

    FindTopPoint1=0;// end of if(*lpSrc==255.0) 

            //若尖角顶点判定条件1为真(即找到顶点起始点),则进行条件2判断 

   if(FindTopPoint1)   

   {   

    while(1) 

    { 

     //防止地址越界 

      if((0<=(i+Count)) && ((i+Count)<lWidth)) 

     { 

          lpSrc=lpimage+(j*lWidth+i+Count); 

            if(*lpSrc!=0)   

       Count++;//count统计同行连续白点数目 

            else            

       break; 

     } 

     else 

      break; 

    } 

    //若当前检测点同行的连续目标白点个数<阈值8时,则判定该处是:广义平尖角 

       if(Count<PlainAngleThreshold)   

    {    

     //反之,尖角顶点判定条件2为非 

        FindTopPoint2=1; 

     //尖角顶点的右端点 

        TopPointEnd=TopPointFirst+Count-1; 

    } 

       else  

     FindTopPoint2=0;  

   }// end of if(FindTopPoint1)  

   /*****************************以上为尖角顶点检测***************************/ 

   //若找到尖角顶点(狭义或广义平尖角:多个连续目标白点且个数和<8),则进行左下和右下边界扫描 

   if(FindTopPoint1 && FindTopPoint2) 

   {    

    //左右向下扫描的列起始点坐标 

    ColumnL=TopPointFirst;    

    ColumnR=TopPointEnd; 

    //从ColumnL开始进行左下边界扫描 

                //尖角左右边界交点的纵坐标 

    RowSumL=0;//总共检查5行 

                //向下扫描,检测0,1,2,3,4共5行(实质是设定尖角的高度为5) 

    while(RowSumL<=4) 

    {  

     //每行扫描时扫描起始方向数置0 

     DirectSum1=0; 

     while(1) 

     { 

      //向下搜索时像素的临时高(离上的像素个数) 

      tempH=j+RowSumL+Direction1[DirectSum1][0]; 

                        //向下搜索时像素的临时宽(离左的像素个数) 

      tempW=ColumnL+Direction1[DirectSum1][1]; 

      if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight)))//地址有效 

      { 

       //五个方向的周围点 

       lpSrc=lpimage+(tempH*lWidth+tempW); 

                            //尖角周围有目标白点 

          if(*lpSrc==255.0)  

       { 

        //则RowSumL++,以扫描下一行 

           RowSumL++; 

           //记录下一行扫描时左边界起始点列坐标 

           ColumnL=tempW; 

        //表示若本次扫描找到隔行边界点,则退出本行扫描以进入下一行扫描 

        break; 

       } 

       else   

        DirectSum1++;//进行下一个方向扫描 

      }//end of if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight))) 

      //地址无效,直接进入到下一个方向扫描 

      else 

      { 

       //进行下一个方向扫描,注意原扫描点的行列坐标不变 

       DirectSum1++; 

      }//end of if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight))) 

      //若跟踪扫描的2个方向全部扫描完还没有找到边界白点,则认为该处轮廓不规则, 

      //不存在尖角,退出小循环,并置ColumnL=0以用于后续尖角判断(左右边界距离) 

         if(DirectSum1>1)  

      { 

             ColumnL=0;    

       break;//退出while(1) 

      } 

     } //while(1)结束 

     if(DirectSum1>1)       

      break;//退出大循环 

    }//end of while(RowSumL<4) 

    /*****************以上为从左顶点向左下扫描进行边界检测*******************/ 

    //从ColumnR开始进行右下边界扫描,向下扫描5行 

    RowSumR=0; 

    //向下扫描,检测0,1,2,3,4共5行 

    while(RowSumR<=4) 

    { 

     DirectSum2=1; 

     while(1) 

     { 

      tempH=j+RowSumR+Direction2[DirectSum2][0]; 

      tempW=ColumnR+Direction2[DirectSum2][1]; 

      //地址有效 

                        if( ((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight)) ) 

      { 

       lpSrc=lpimage+(tempH*lWidth+tempW); 

       //此方向点为目标白点 

       if(*lpSrc==255.0) 

       { 

        //则RowSumR++,以扫描下一行 

        RowSumR++; 

           //记录下一行扫描时右边界起始点列坐标 

        ColumnR=tempW; 

        //表示若本次扫描找到隔行边界点,则退出本行扫描以进入下一行扫描 

           break; 

       } 

          else 

       { 

        //进行下一个方向扫描,注意原扫描点的行列坐标不变 

           DirectSum2--; 

       }//end of if(*lpSrc==255.0) 

      } 

      else   

      { 

       //地址无效,直接进行下一方向扫描 

       DirectSum2--;//end of if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight))) 

      } 

      //若跟踪扫描的5个方向全部扫描完还没有找到边界白点,则认为该处轮廓不规则, 

      //不存在尖角,退出小循环,并置ColumnL=0以用于后续尖角判断(左右边界距离) 

      if(DirectSum2<0)  

      { 

          ColumnR=0;   

       break;//退出while(1) 

      } 

     } //while(1)结束   

     if(DirectSum2<0)       

      break;//退出大循环 

    }//end of while(RowSumR<=4) 

    /******************以上为从右顶点向右下扫描进行边界检测*********************/ 

    // 计算左右边界点之间的象素个数,即距离 

       BounderSpaceNum=ColumnR-ColumnL-1;     

       // 尖角判断和数目统计 

               if((BounderSpaceNum>=0 && BounderSpaceNum<32) && (RowSumL==5) && (RowSumR==5))  

    { 

      SharpAngle_Num++; 

  

    } 

   }//end of if(FindTopPoint1 && FindTopPoint2) 

   //转当前行的下一象素点检测 

   i=i+Count;//cout设置为1,若找到连续多点,一下子加,若没找到则一个个加 

  }//当前行的所有象素点检测完毕(while(i)) 

 }//整个目标矩形区域的所有行均检测完毕(while(j)) 

}