//根据点序列的分布来判断点是否孤僻
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();
}