1. 程式人生 > >在OpenCV中實現判斷離散點

在OpenCV中實現判斷離散點

     如何判斷離散點,利用遞迴演算法統計連續點的個數,通過閾值來判定是否為離散點。opencv程式碼實現:

#include "cv.h"
#include "highgui.h"
#include <queue>

//點插入佇列中
bool  flagpoint(POINT point,PointQue &que)
{

 for(int i=0;i<que.size();i++)
 {
  if(que[i].x==point.x && que[i].y==point.y)
  {
     return false;
  }
  else
  {
   que.push_back(point);
   return true;
  }

 }
}

//佇列中是否有此點
bool HaveFindPoint(PointQue findque,int x,int y)
{

    for(int i=0;i<findque.size();i++)
    {
  if(findque[i].x==x && findque[i].y==y)
  {
   return false;
  }

    }
   return true;
}

 /*
函式說明:判斷離散點 [利用遞迴演算法統計連續點的個數,通過閾值來判定是否為離散點]
目前只支援對2值影象進行處理
引數說明:
psrc 影象 
lWidth,lHeight 圖片的寬高
X,Y,當前的座標點
pque收集到的點
m_lend點的個數,離散點的判定長度
m_number已經收集到的個數
返回值:bool型別;是離散點返回false 不是離散點返回true
*/
   
bool GetNoisePoint(IplImage  *pSrc,RECT FindRect,int x,int y,PointQue  &pque,PointQue &FindQue,int m_lend,int m_number,bool bFirstPoint) 
{
  unsigned char *p = (unsigned char*)pSrc->imageData;
     #define PIX(x,y) p[pSrc->widthStep * y + x] 
     
     POINT point;

      m_number++;
  
   if(bFirstPoint)
   { 
    point.x=x;
       point.y=y;
    pque.push_back(point);
   }
  
  

  if(m_number>m_lend)
   return false;
  else
  {
           //考察上下左右以及左上、右上、左下、右下八個方向
     //如果是黑色點,則呼叫函式自身進行遞迴
     //考察下面點
    ///上方///
   point.x=x;
   point.y=y-1;
   

   if(pque.size()>3&&pque[0].x==x&&pque[0].y==(y-1))
   {
    return true;///閉合區域,認為是雜點////
   }

   if((y-1>=FindRect.top)&&PIX(x,y-1)!=0&&(flagpoint(point,pque)))
     {
      GetNoisePoint(pSrc,FindRect,x,y,pque,FindQue,m_lend,m_number,false);
     }

   FindQue.push_back(point);
    
     //左上點
     point.x=x-1;
     point.y=y-1;

     if(pque.size()>3&&pque[0].x==(x-1)&&pque[0].y==(y-1))
   {
    return true;///閉合區域,認為是雜點////
   }

     if((y-1>FindRect.top)&&(x-1>=FindRect.left)&&PIX(x-1,y-1)!=0&&(flagpoint(point,pque)))
     {
               GetNoisePoint(pSrc,FindRect, x-1, y-1,pque,FindQue,m_lend,m_number,false);

     }
     FindQue.push_back(point);

     //左邊

     point.x=x-1;
     point.y=y;

      if(pque.size()>3&&pque[0].x==(x-1)&&pque[0].y==(y))
   {
    return true;///閉合區域,認為是雜點////
   }

   if((x-1>=FindRect.left)&&PIX(x-1,y)!=0&&(flagpoint(point,pque)))
     {
               GetNoisePoint(pSrc, FindRect, x-1, y, pque,FindQue,m_lend,m_number,false);

     }
   FindQue.push_back(point);

    
     //左下邊 
     point.x=x-1;
     point.y=y+1;

    
      if(pque.size()>3&&pque[0].x==(x-1)&&pque[0].y==(y+1))
   {
    return true;///閉合區域,認為是雜點////
   }


    
   if((x-1>FindRect.left)&&(y+1<FindRect.bottom)&&PIX(x-1,y+1)!=0&&(flagpoint(point,pque)))
     {
               GetNoisePoint(pSrc, FindRect, x-1, y+1, pque,FindQue,m_lend,m_number,false);

     }
   FindQue.push_back(point);

     ///下面
      point.x=x;
   point.y=y+1;

   
      if(pque.size()>3&&pque[0].x==(x)&&pque[0].y==(y+1))
   {
    return true;///閉合區域,認為是雜點////
   }


   if((y+1<FindRect.bottom)&&PIX(x,y+1)!=0&&(flagpoint(point,pque)))
     {
               GetNoisePoint(pSrc, FindRect, x, y+1,pque,FindQue,m_lend,m_number,false);

     }
   FindQue.push_back(point);
   
     //右下面  
 
     point.x=x+1;
     point.y=y+1;
    
      if(pque.size()>3&&pque[0].x==(x+1)&&pque[0].y==(y+1))
   {
    return true;///閉合區域,認為是雜點////
   }


   if((y+1<FindRect.bottom)&&(x+1<FindRect.right)&&PIX(x,y+1)!=0&&(flagpoint(point,pque)))
     {
               GetNoisePoint(pSrc,FindRect, x+1, y+1,pque,FindQue,m_lend,m_number,false);

     }
   FindQue.push_back(point);

  //右邊
 
      point.x=x+1;
      point.y=y;

   
      if(pque.size()>3&&pque[0].x==(x+1)&&pque[0].y==(y))
   {
    return true;///閉合區域,認為是雜點////
   }


  
   if((x+1<FindRect.right)&&PIX(x+1,y)!=0&&(flagpoint(point,pque)))
     {
               GetNoisePoint(pSrc, FindRect ,x+1, y, pque,FindQue,m_lend,m_number,false);

     }
   FindQue.push_back(point);

     
  //右上///

    
  point.x=x+1;
  point.y=y-1;

      if(pque.size()>3&&pque[0].x==(x+1)&&pque[0].y==(y-1))
   {
    return true;///閉合區域,認為是雜點////
   }

   if((x+1<FindRect.right)&&(y-1>FindRect.top)&&PIX(x+1,y-1)!=0&&(flagpoint(point,pque)))
     {
              GetNoisePoint(pSrc,FindRect, x+1, y-1, pque,FindQue,m_lend,m_number,false);

     }
  
  }
  FindQue.push_back(point);

  
 //如果遞迴結束,返回false,說明是離散點
 return FALSE;


}