⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wr.cpp

📁 曲线角点检测的二种算法
💻 CPP
字号:
//wk1.cpp
#include <StdAfx.h>
#include <windows.h>
#include <string.h>
#include <vector>
#include <iomanip.h>
#include <math.h>
#include "wr.h"
using namespace std ;

				                          		  
///////////////////////////////////////////////求两点间距离
double distance(POT  a,POT  b)
{
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

///////////////////////////////////////////////////////////取得正太分布值

/////////////////////////////////////////////////初始化参数
CWR::CWR(HWND hwnd_pa) 
{
	m_hwnd_pa=hwnd_pa;
	::AfxGetApp()->GetMainWnd()->SetWindowText("角度权值算法");
}
 
CWR::~CWR()
{
	::AfxGetApp()->GetMainWnd()->SetWindowText("");
}
void CWR::setparam(const char * filename ,		 
			  double _b____b,					 
			  double _u____u,					 
			  int dmin___k,						 
			  int dmax___delta,						 
              double alpa___alpa,					 		  
			  int n___ramda
			  )
{
	strcpy(wkp.fn,filename);
	wkp.dmin=dmin___k ;
	wkp.dmax= dmax___delta;
	wkp.alpa= alpa___alpa;
	wkp._b=_b____b ;
	wkp._u= _u____u;
    wkp.n=n___ramda ;

}
char*
CWR::getfn()
{
	return wkp.fn; 
}



///////////////////////////////////////////////第一次扫描
void CWR::firstscanf()
{   bl.clear();
    vlsv.clear();
	vwk.clear();
	for(int i=0;i<list_n.size();i++)bl.push_back(true);
	int jt,kt,len;
	double aftemp1;
	len=list_n.size();

for(i=0;i<len;i++)
	{
    int mid;
	mid=(wkp.dmin+wkp.dmax)*(wkp.dmin+wkp.dmax)/4;
	int j=1;
	jt=(i+j)%len;
	while(distance(list_n[i],list_n[jt])<mid)
		{
		jt=(i+j)%len;
		j++;
		}

	int k=1;
	kt=(i-k+len)%len;
	while(distance(list_n[i],list_n[kt])<mid)
		{
		k++;
		kt=(i-k+len)%len;
		}
	vPOT tp ;
    tp.x=(double) list_n[kt].x-list_n[i].x;
    tp.y=(double) list_n[kt].y-list_n[i].y;
	vwk.push_back(tp);
	tp.x=(double) list_n[jt].x-list_n[i].x;
    tp.y=(double) list_n[jt].y-list_n[i].y;
    vwk.push_back(tp);
	double af[10];
	for(j=0;j<wkp.n;j++)
	{	
	double a=sqrt(distance(list_n[i],list_n[(jt-2+j+len)%len] ));
	double b=sqrt(distance(list_n[i],list_n[(kt+2-j+len)%len] ));
	double c=sqrt(distance(list_n[(jt-2+j+len)%len],list_n[(kt+2-j+len)%len]));
	af[j]=acos2((a*a+b*b-c*c)/(2*a*b));	
	}  
	double sum=0;
	double fai;
	aftemp1=0;
	for(j=0;j<wkp.n;j++)
	{  
		fai=gformula(wkp._b ,wkp._u , j-wkp.n/2);
		aftemp1+=af[j]*fai; 
		sum+=fai;
	}
    aftemp1/=sum;   
	vlsv.push_back(aftemp1);	
	if(aftemp1>wkp.alpa/180.0*PI)bl[i]=false;	
	}
}

/////////////////////////////////////////////////////第二次扫描
void CWR::secondscanf()     
{
	int len=wkp.totaln;
	int ii,i;

for(i=0;i<len;i++)	 
	 if(bl[i])
	 {	
		 for(ii=0;
			 distance(list_n[i],list_n[(i+1+ii+len)%len])<wkp.dmax*wkp.dmax;
		     ii++
			 )   
		 if(vlsv[i]>=vlsv[(i+1+ii+len)%len])bl[i]=false; 
	 }
for(i=0;i<len;i++)	
      if(bl[i])
	 {
		for(ii=0;
			distance(list_n[i],list_n[(i+1-ii+len)%len])<wkp.dmax*wkp.dmax;
			ii++)   
		if(vlsv[i]>vlsv[(i+1-ii+len)%len])bl[i]=false; 	 
	 }
    wkp.m_cornerpoint=0;
	for(i=0;i<bl.size();i++)
	if(bl[i])wkp.m_cornerpoint++;

}



void 
CWR::startwk()
{
	wkp.totaln=rchaincode(wkp.fn);
	firstscanf();
	secondscanf();
}



////////////////////////////////////////////输出关于角点检测算法的数据详细信息
void CWR::get_data(const char * logname)
{
	ofstream oon (logname);	
oon<<"Y.H.He"<<endl;
	SYSTEMTIME st ;
	GetLocalTime(&st);
oon<<st.wYear<<"-"<<st.wMonth<<"-"<<st.wDay <<endl 
   <<st.wHour<<":"<<st.wMinute<<":"<<st.wSecond<<endl ;
	oon<<"-----------------------关于角点检测算法的数据详细信息---------"<<"\n"<<"\n";	
	oon<<"#######################原始参数的值###########################\n";
	oon<<"打开的文件是:		"<<wkp.fn<<"\n";
	oon<<"曲线上点的个数是:	"<<wkp.totaln<<"\n";
	oon<<"检测到点的个数是:	"<<wkp.m_cornerpoint<<"\n";
	oon<<"角点最大角度值是:	"<<wkp.alpa<<"\n";
	oon<<"距离最小值dmin是:	"<<wkp.dmin<<"\n";
	oon<<"距离最大值dmax是:	"<<wkp.dmax<<"\n";
	oon<<"正态分布函数参数σ是:	"<<wkp._b<<"\n";
	oon<<"正态分布函数参数μ是:	"<<wkp._u<<"\n";
	oon<<"正态分布函数参数 n是:  "<<wkp.n<<"\n";
	oon<<"#######################点的坐标和评估值#######################\n";
	for(int i=0;i<list_n.size();i++)
	if(bl[i])
	{
		oon<<"第"<<i<<"个点  坐标是:("<<list_n[i].x<<","<<list_n[i].y<<")"

<<",角度评估是:"<<vlsv[i]*180/PI<<",     角点\n";
	}
	else
	{
		oon<<"第"<<i<<"个点  坐标是:("<<list_n[i].x<<","<<list_n[i].y<<")"

<<",角度评估是:"<<vlsv[i]*180/PI<<",   非角点\n";
	}			
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -