根据点序列的分布来判断点是否孤僻

//根据点序列的分布来判断点是否孤僻
void mark_sparse_flag(point_distributed_list &points_distributed)
{
	int max_x,min_x,max_y,min_y;
	get_range(points_distributed,min_x,min_y,max_x,max_y);

	int bin=5;//单区间的大小
	int x_bins_num=cvCeil(((double)max_x-min_x)/bin);//区间数
	vector<int> x_bin_nums(x_bins_num,0);
	int y_bins_num=cvCeil(((double)max_y-min_y)/bin);//区间数
	vector<int> y_bin_nums(y_bins_num,0);

	int i,k;
	int n=points_distributed.size();
	point_distributed_list::iterator pt=points_distributed.begin();
	for(;pt!=points_distributed.end();pt++)	
	{
		for (i=0;i<x_bins_num;i++)	//规划范围	
		{
			if (pt->point.x>=(min_x+bin*i)&&pt->point.x<(min_x+bin*(i+1))) 
			{
				x_bin_nums[i]++;			
				pt->x_distributed=i;
				break;
			}
		}

		for (i=0;i<y_bins_num;i++)	//规划范围	
		{
			if (pt->point.y>=(min_y+bin*i)&&pt->point.y<(min_y+bin*(i+1))) 
			{
				y_bin_nums[i]++;			
				pt->y_distributed=i;
				break;
			}
		}
	}

	//标记孤僻点
	for(pt=points_distributed.begin();pt!=points_distributed.end();pt++)
	{
		//if (((double)x_bin_nums[pt->x_distributed]/x_bins_num<0.05)||((double)y_bin_nums[pt->y_distributed]/y_bins_num<0.05)) 
		if (((double)x_bin_nums[pt->x_distributed]<3)||((double)y_bin_nums[pt->y_distributed]<3))
			pt->sparse_flag=1;	
	}
}

 

 

int remove_the_error_points(matchingslist matchings,IplImage* &matchedimg,IplImage* img,CvRect &rect1,CvRect &rect2)
{
	matchingslist::iterator ptr = matchings.begin();
	int n,bins=20;
	int num_bins=cvCeil(img->width/bins);
	vector<int> bins_num(num_bins,0);

	for(ptr=matchings.begin();ptr!=matchings.end();ptr++)
	{
		for (n=0;n<num_bins;n++)		
		{if (ptr->first.x>bins*n&&ptr->first.x<=bins*(n+1)) bins_num[n]++;}
	}


	CvSeqWriter writer1,writer2;
	CvMemStorage* storage1 = cvCreateMemStorage(0);
	CvMemStorage* storage2 = cvCreateMemStorage(0);
	CvSeq* point_seq1=cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage1 );
	CvSeq* point_seq2=cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage2 );
	cvStartAppendToSeq(point_seq1, &writer1 );
	cvStartAppendToSeq(point_seq2, &writer2 );

	CvPoint point1,point2;
	int i;
	for (n=0;n<num_bins;n++)		
	{
		if ((double)bins_num[n]/matchings.size()<0.05)
		{
			i=0;
			for(ptr=matchings.begin();ptr!=matchings.end();)
			{
				if(ptr->first.x>bins*n&&ptr->first.x<=bins*(n+1))
				{
					ptr=matchings.erase(ptr);
					i++;
					if (i==bins_num[n]) break;
					continue;
				}
				ptr++;
			}
		}
	}

	for(ptr=matchings.begin();ptr!=matchings.end();ptr++)
	{
		point1.x=ptr->first.x;
		point1.y=ptr->first.y;
		point2.x=ptr->second.x;
		point2.y=ptr->second.y;
		CV_WRITE_SEQ_ELEM(point1, writer1);
		CV_WRITE_SEQ_ELEM(point2, writer2);
		point2.x+=img->width+BAND_W;
		cvLine(matchedimg, point1, point2, CV_RGB(255,0,0), 1, 8, 0 );
	}
	cvEndWriteSeq( &writer1);
	cvEndWriteSeq( &writer2);

	rect1=cvBoundingRect(point_seq1);
	rect2=cvBoundingRect(point_seq2);

	expand_rect(rect1,img);
	expand_rect(rect2,img);

	cvRectangle(matchedimg,cvPoint(rect1.x,rect1.y),cvPoint(rect1.x+rect1.width,rect1.y+rect1.height) , CV_RGB(0,0,255),1, 8, 0 );
	cvRectangle(matchedimg,cvPoint(rect2.x+img->width+BAND_W,rect2.y),cvPoint(rect2.x+rect2.width+img->width+BAND_W,rect2.y+rect2.height) , CV_RGB(0,0,255),1, 8, 0 );
	return matchings.size();
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值