在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;
}