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

📄 text2.txt

📁 数字摄影测量相关算法编程,在VC环境下实现影像特征点提取.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	  float C_AB=sigma_AB(rrii,matchii[i],matchjj[i],aveB,SizeSearch		 // 协方差
								,llii,aveA,SizeMatch);
	  float rel_k=C_AB/sqrt(sigmaA*sigmaB);		//相关系数
	  matchadnn[i]=fabs(rel_k);
	  sumgray+=matchadnn[i];
	  if(matchadnn[i]>maxr)//寻找最大值
	  {
		drag[ik]=1;
		maxr=matchadnn[i];
		maxii=matchii[i];
		maxjj=matchjj[i];
		matchadnn[kk]=matchadnn[i];
	  }
	}
   int matchii0[5],matchjj0[5],matchadnn0[5];
   matchii0[0]=maxii;//复制
   matchjj0[0]=maxjj;
   if(maxii==0)           //避免下面取负值
          maxii=3;
   matchii0[1]=maxii-1;//复制
   matchjj0[1]=maxjj;
   matchii0[2]=maxii+1;//复制
   matchjj0[2]=maxjj;
   matchii0[3]=maxii;//复制
   if(maxjj==0)           //避免下面取负值
          maxjj=3;
   matchjj0[3]=maxjj-1;
   matchii0[4]=maxii;//复制
   matchjj0[4]=maxjj+1;
   for(i=0;i<5;i++)
	{
	  float aveB=average(rrii,SizeSearch,matchii0[i],matchjj0[i],SizeMatch);
	  float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch);		 //方差
	  float sigmaB=sigma(rrii,SizeSearch,matchii0[i],matchjj0[i],aveB,SizeMatch);
	  float C_AB=sigma_AB(rrii,matchii0[i],matchjj0[i],aveB,SizeSearch		 // 协方差
								,llii,aveA,SizeMatch);
	  float rel_k=C_AB/sqrt(sigmaA*sigmaB);		//相关系数
	  rel_k=fabs(rel_k);
	  if(rel_k>maxr)//寻找最大值
	  {
		maxr=rel_k;
		maxii=matchii0[i];
		maxjj=matchjj0[i];
		matchadnn[kk]=rel_k;
	  }
	}

//赌轮法选择出中间群体
   for(int inn=0;inn<nn;inn++)
   {
	   i=0;
	   float partsum=0.0;
	   float wheel_pos=rnd()*sumgray;
	   do
	   {		   
		   partsum+=matchadnn[i];
		   i=i+1;
	   }while(partsum<wheel_pos&&i<nn);
      matchii[inn]=matchii[i-1];
      matchjj[inn]=matchjj[i-1];
   }
//从中间群体随机产生两个父代和一个模板进行杂交
   char (*boy)[16],(*girl)[16];
   boy=new char [nn/2][16];
   girl=new char [nn/2][16];
   int zajiaosum=(nn-2)/2,drag0=0;
   if(ik>3)
	   if(drag[ik]==0&&drag[ik-1]==0&&drag[ik-2]==0&&drag[ik-3]==0&&drag[ik-4]==0)
		   zajiaosum=(nn-6)/2;
   if (ik>8)
	{
	    drag0=0;
		for(i=ik-9;i<=ik;i++)
			if(drag[i]==1)
				drag0=1;
        if(!drag0)
		   zajiaosum=(nn-11)/2;
	}
    if(ik>13)
	{
	    drag0=0;
		for(i=ik-14;i<=ik;i++)
			if(drag[i]==1)
				drag0=1;
        if(!drag0)
		{
		   zajiaosum=(nn-16)/2;
		}
	}
    if(ik>18)
	{
	    drag0=0;
		for(i=ik-19;i<=ik;i++)
			if(drag[i]==1)
				drag0=1;
        if(!drag0)
		{
		  matchi=maxii+CurPt.y-SizeSearch/2+SizeMatch/2;
		  matchj=maxjj+CurPt.x-SizeSearch/2+SizeMatch/2;
          goto line;
		}
	}
	int tubianshu;
    if(nn%2==1)
	{
        zajiaosum+=1;
		tubianshu=zajiaosum*2;
	}
    else 
        tubianshu=zajiaosum*2+1;
	for(int jk=0;jk<zajiaosum;jk++)
	{
	do{
	random1=rand()%nn;
	random2=rand()%nn;
	}while(random1==random2);//不同父代
	//||matchii[random1]==matchii[random2]&&matchjj[random1]==matchjj[random2]);
//	matchii[random1]=127;
//	matchjj[random1]=128;
	char rowfather[8],colfather[8],father[16];
//	int_gelei(127,rowfather);
//	int_gelei(128,colfather);
//    gelei_gelei(rowfather,colfather,father);
	int_gelei(matchii[random1],rowfather);
	int_gelei(matchjj[random1],colfather);
    gelei_gelei(rowfather,colfather,father);
	char rowmother[8],colmother[8],mother[16];
//	int_gelei(128,rowmother);
//	int_gelei(127,colmother);
//    gelei_gelei(rowmother,colmother,mother);
	int_gelei(matchii[random2],rowmother);
	int_gelei(matchjj[random2],colmother);
    gelei_gelei(rowmother,colmother,mother);

//杂交
	for(int inn=0;inn<16;inn++)
	{
		random[inn]=rand()%2;//随机产生模板
        if(random[inn]==0)
		{
	       boy[jk][inn]=father[inn];
		   girl[jk][inn]=mother[inn];
		}
		else if(random[inn]==1)
		{
			boy[jk][inn]=mother[inn];
			girl[jk][inn]=father[inn];
		}
	}
//	gelei_int(boy,matchii[ak++],matchjj[ak++]);
//	gelei_int(boy,matchii[ak++],matchjj[ak++]);
	}
//突变
    char rowparent[8],colparent[8],parent[16];
    char (*son)[16];
    son=new char [nn-2*zajiaosum][16];
	for(i=0;i<nn-2*zajiaosum;i++)
	{
	int random0=rand()%nn;
	int_gelei(matchii[random0],rowparent);
	int_gelei(matchjj[random0],colparent);
    gelei_gelei(rowparent,colparent,parent);
   int change1,change2;
   do{
   change1=rand()%16;
   change2=rand()%16;
   }while(change1==change2);
   for(j=0;j<16;j++)
	   son[i][j]=parent[j];
   if(parent[change1]=='0')
	   son[i][change1]='1';
   else if(parent[change1]=='1')
	   son[i][change1]='0';
   if(parent[change2]=='0')
	   son[i][change2]='1';
   else if(parent[change2]=='1')
	   son[i][change2]='0';
	}

//复制,最佳个体保存法
   matchii[0]=maxii;
   matchjj[0]=maxjj;
 //格雷码数转化为十进制数
   int *p1,*p2;
   for(i=1;i<zajiaosum*2+1;i+=2)//杂交
   {  
    p1=&matchii[i];
    p2=&matchjj[i];
	gelei_int(boy[i/2],p1,p2);
//    matchii[i]=*p1;
 //   matchjj[i]=*p2;
    p1=&matchii[i+1];
    p2=&matchjj[i+1];
	gelei_int(girl[i/2],p1,p2);
//    matchii[i+1]=*p1;
//    matchjj[i+1]=*p2;
	}

   for(i=tubianshu;i<nn;i++)
   {
   p1=&matchii[i];
   p2=&matchjj[i];
   gelei_int(son[i-tubianshu],p1,p2);  //突变
   }
   }//迭代结束
   maxr=0.0;
 	for(i=0;i<nn;i++)
	{
	  float aveB=average(rrii,SizeSearch,matchii[i],matchjj[i],SizeMatch);
	  float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch);		 //方差
	  float sigmaB=sigma(rrii,SizeSearch,matchii[i],matchjj[i],aveB,SizeMatch);
	  float C_AB=sigma_AB(rrii,matchii[i],matchjj[i],aveB,SizeSearch		 // 协方差
								,llii,aveA,SizeMatch);
	  float rel_k=C_AB/sqrt(sigmaA*sigmaB);		//相关系数
	  rel_k=fabs(rel_k);
	  if(rel_k>=maxr)//寻找最大值
	  {
		maxr=rel_k;
		matchi=matchii[i]+CurPt.y-SizeSearch/2+SizeMatch/2;
		matchj=matchjj[i]+CurPt.x-SizeSearch/2+SizeMatch/2;
	  }
	}
//    delete [] matchii;
//    delete [] matchjj;
//	delete [] matchadnn;
line:
	finish = clock();  //结束时间
	EndWaitCursor();
	maxrelk=maxr;
//	pChildFrm=GetActiveFrame();
//	pView=(CGaMatchView*)(pChildFrm->GetActiveView());
	if(nTask==11)
	{
	POSITION pos=GetFirstViewPosition();
	CGaMatchView* pView=(CGaMatchView* )GetNextView(pos);
	CPoint pt0=pView->GetDeviceScrollPosition();
	CDC* dc=pView->GetDC();
	CPen pen1(PS_SOLID,1,RGB(255,0,0));
	dc->SelectObject(&pen1);
/*	dc->MoveTo(CurPt.x-pt0.x-5,CurPt.y-pt0.y);
	dc->LineTo(CurPt.x-pt0.x+5,CurPt.y-pt0.y);
	dc->MoveTo(CurPt.x-pt0.x,CurPt.y-5-pt0.y);
	dc->LineTo(CurPt.x-pt0.x,CurPt.y+5-pt0.y);*/
	dc->MoveTo(matchj-pt0.x-5,matchi-pt0.y);
	dc->LineTo(matchj-pt0.x+5,matchi-pt0.y);
	dc->MoveTo(matchj-pt0.x,matchi-pt0.y-5);
	dc->LineTo(matchj-pt0.x,matchi-pt0.y+5);

	static int num=1;
	char string[30];
	sprintf(string,"%d",num);
    dc->TextOut(matchj-pt0.x+5,matchi-pt0.y+5,string);
	num++;
    double duration = (double)(finish - start); // CLOCKS_PER_SEC;计算经历时间段  
	char ss[40];
	wsprintf(ss,"lx=%d,ly=%d,rx=%d,ry=%d,maxr=%d,time_span=%d",lx,ly,matchj,matchi,(int)(maxr*100),(int)duration);
	AfxMessageBox(ss);
	}
}
void int_gelei(long xx,char zzs[])//十进制数转化为格雷码
{
	char yys[9],yyss[9];

    _itoa(xx,yys,2);
	int i=0;
	while(yys[i]) 
		i++;
	for(int j=0;j<8;j++)
		if(j<8-i)
		   yyss[j]='0';
		else 
		   yyss[j]=yys[j+i-8];
	 zzs[0]=yyss[0];
     for(j=1;j<8;j++)
	 {
		 if(yyss[j-1]=='0'&&yyss[j]=='0'||yyss[j-1]=='1'&&yyss[j]=='1')
            zzs[j]='0';
		 else if(yyss[j-1]=='0'&&yyss[j]=='1'||yyss[j-1]=='1'&&yyss[j]=='0')
            zzs[j]='1';
	 }

}
void gelei_gelei(char xx[],char yy[],char sums[])//用行格雷码和列格雷码进行格雷编码
{
   for(int i=0;i<16;i++)
   {
	   if(i<8)
	     sums[i]=xx[i];
       else if(i>=8)
	     sums[i]=yy[i-8];
   }
}
long gelei_boi(long xx)//格雷码转化为二进制数
{
	CString xxs;
	char yys[1],aa[1],bb[1];
	long sum=0,yy;
	int len,aa0,bb0,cc0;
	xxs.Format("%d",xx);
	yys[0]=xxs.GetAt(0);	
	len=xxs.GetLength();
	sum=atoi(yys)*pow(10,len-1);
	cc0=atoi(yys);
	for(int i=1;i<len;i++)
	{
       aa[0]=xxs.GetAt(i);
	   aa0=atoi(aa);
	   cc0+=aa0;
	   if(cc0==2)
		   cc0=0;
	   sum+=cc0*pow(10,len-1-i);
	 }
	return sum;
}

long boi_int(long xx)//二进制数转化为十进制数
{
	CString xxs,yys;
	long sum=0,yy;
	int len;
	xxs.Format("%d",xx);
	len=xxs.GetLength();
	for(int i=0;i<len;i++)
	{
		yys.Format("%c",xxs.GetAt(i));
		yy=atoi(yys);
		sum+=yy*pow(2,len-1-i);
	}
   return sum;
}
void gelei_int(char parent[],int *row,int *col)//格雷码转化为十进制数
{
	char rows[8],cols[8];
	int yy1,yy2;
	rows[0]=parent[0];
	cols[0]=parent[8];
	for(int i=1;i<8;i++)
	{
        if(rows[i-1]=='0'&&parent[i]=='0'||rows[i-1]=='1'&&parent[i]=='1')
			rows[i]='0';
        else if(rows[i-1]=='0'&&parent[i]=='1'||rows[i-1]=='1'&&parent[i]=='0')
			rows[i]='1';
	}
	for(i=9;i<16;i++)
	{
        if(cols[i-9]=='0'&&parent[i]=='0'||cols[i-9]=='1'&&parent[i]=='1')
			cols[i-8]='0';
        else if(cols[i-9]=='0'&&parent[i]=='1'||cols[i-9]=='1'&&parent[i]=='0')
			cols[i-8]='1';
	}
	CString rowss,colss; 
	int aa=0,bb=0;
	for(i=0;i<8;i++)
	{
		rowss=rows[i];
 		yy1=atoi(rowss);
		aa+=yy1*pow(2,8-1-i);
	}
	*row=aa;
	for(i=0;i<8;i++)
	{
		colss=cols[i];
 		yy2=atoi(colss);
		bb+=yy2*pow(2,8-1-i);
	}
	*col=bb;
}
float rnd()
{
	int i;
	float j;
	i=rand();
	j=float(i)/float(RAND_MAX);
	return j;
}

⌨️ 快捷键说明

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