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

📄 text1.txt

📁 数字摄影测量相关算法编程,在VC环境下实现影像特征点提取.
💻 TXT
字号:
void CGaMatchDoc::GoodChooseGa(int x,int y) //择优选取良种
{
	BeginWaitCursor();
	int i,j,step,*matchii,*matchjj;
	int random1,random2,random[16];
	double adnn,maxr=0.0,maxl=0.0,adsum,*matchadnn;
	int lx,ly,rx,ry;
    clock_t start, finish;
	lx=x;ly=y;
    GetmatchWindow(lx,ly);
	rx=x;ry=y;
    GetSearchWind(rx,ry);
	int kk=0,kkk,nn,kk0=0;
	step=SizeMatch/8;//4,16
	nn=((SizeSearch-SizeMatch+1)/step+1)*((SizeSearch-SizeMatch+1)/step+1);
	matchii=new int [nn+2];
	matchjj=new int [nn+2];
	matchadnn=new double [nn+2];
	start = clock();//获得开始时间
    //初始种群的选取
/*	for(i=0;i<SizeSearch-SizeMatch+1;i+=step)
	{
		for(j=0;j<SizeSearch-SizeMatch+1;j+=step)
		{
                matchii[kk]=i;
				matchjj[kk]=j;
				kk++;
		}
	}*/
	float sumgray=0.0;
	float avergray;
	float aveA=average(llii,SizeMatch,0,0,SizeMatch);
	for(i=0;i<SizeSearch-SizeMatch+1;i+=step)
	{
		for(j=0;j<SizeSearch-SizeMatch+1;j+=step)
		{
			float aveB=average(rrii,SizeSearch,i,j,SizeMatch);
			float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch);		 //方差
			float sigmaB=sigma(rrii,SizeSearch,i,j,aveB,SizeMatch);
			float C_AB=sigma_AB(rrii,i,j,aveB,SizeSearch		 // 协方差
								,llii,aveA,SizeMatch);
			float rel_k=C_AB/sqrt(sigmaA*sigmaB);		//相关系数
			rel_k=fabs(rel_k);
			sumgray+=rel_k;
		}
	}
    avergray=sumgray/nn;
	for(i=0;i<SizeSearch-SizeMatch+1;i+=step)
	{
		for(j=0;j<SizeSearch-SizeMatch+1;j+=step)
		{
			float aveB=average(rrii,SizeSearch,i,j,SizeMatch);
			float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch);		 //方差
			float sigmaB=sigma(rrii,SizeSearch,i,j,aveB,SizeMatch);
			float C_AB=sigma_AB(rrii,i,j,aveB,SizeSearch		 // 协方差
								,llii,aveA,SizeMatch);
			float rel_k=C_AB/sqrt(sigmaA*sigmaB);		//相关系数
			rel_k=fabs(rel_k);
            if(rel_k>2.0*avergray)//0.10,17/12,4/3,2,1,3
			{
            matchii[kk]=i;
			matchjj[kk]=j;
			kk++;
			}
			kk0++;
		}
	}
	int sumnum=30;
	int *drag,maxii,maxjj;
	drag=new int [sumnum];
	for(i=0;i<sumnum;i++)
		drag[i]=0;
//	float aveA=average(llii,SizeMatch,0,0,SizeMatch);
    //以相关系数为指标复制adnn为最大的一个
	for(int ik=0;ik<30;ik++)//最大迭代次数设为30
	{
	nn=kk;
	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)//寻找最大值
	  {
		drag[ik]=1;
		maxr=rel_k;
		maxii=matchii[i];
		maxjj=matchjj[i];
		matchadnn[kk]=rel_k;
	  }
	}
//随机产生两个父代和一个模板进行杂交
   char (*boy)[16],(*girl)[16];
   boy=new char [nn/2][16];
   girl=new char [nn/2][16];
   int zajiaosum=nn/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/2-2;
   if (ik>8)
	{
	    drag0=0;
		for(i=ik-9;i<=ik;i++)
			if(drag[i]==1)
				drag0=1;
        if(!drag0)
		   zajiaosum=nn/2-5;
	}
    if(ik>13)
	{
	    drag0=0;
		for(i=ik-14;i<=ik;i++)
			if(drag[i]==1)
				drag0=1;
        if(!drag0)
		{
		   zajiaosum=nn/2-7;
		}
	}
    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;
		}
	}	
	for(int jk=0;jk<zajiaosum-5;jk++)
	{
	do{
	random1=rand()%nn;
	random2=rand()%nn;
	}while(random1==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';
	}
//格雷码数转化为十进制数
   int *p1,*p2;
   matchii[0]=maxii;//复制
   matchjj[0]=maxjj;
   if(maxii==0)           //避免下面取负值
          maxii=3;
   matchii[1]=maxii-1;//复制
   matchjj[1]=maxjj;
   matchii[2]=maxii+1;//复制
   matchjj[2]=maxjj;
   matchii[3]=maxii;//复制
   if(maxjj==0)           //避免下面取负值
          maxjj=3;
   matchjj[3]=maxjj-1;
   matchii[4]=maxii;//复制
   matchjj[4]=maxjj+1;
   for(i=5;i<zajiaosum*2;i+=2)//杂交
   {  
    p1=&matchii[i];
    p2=&matchjj[i];
	gelei_int(boy[i/2-2],p1,p2);
//    matchii[i]=*p1;
 //   matchjj[i]=*p2;
    p1=&matchii[i+1];
    p2=&matchjj[i+1];
	gelei_int(girl[i/2-2],p1,p2);
//    matchii[i+1]=*p1;
//    matchjj[i+1]=*p2;
	}
   for(i=zajiaosum*2;i<nn;i++)
   {
   p1=&matchii[i];
   p2=&matchjj[i];
   gelei_int(son[i-(zajiaosum*2)],p1,p2);  //突变
   }
   }//迭代结束
 	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();
//	pChildFrm=GetActiveFrame();
//	pView=(CGaMatchView*)(pChildFrm->GetActiveView());
	if(nTask==10)
	{
	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(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[80];
	wsprintf(ss,"i=%d,j=%d,maxr=%d,time_span=%d,nn=%d",matchi,matchj,(int)(maxr*100),(int)duration,(int)nn*30);
	AfxMessageBox(ss);
	}
	}

⌨️ 快捷键说明

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