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

📄 video_ntsc_pal.c

📁 dm642上实现运动目标检测与跟踪
💻 C
📖 第 1 页 / 共 2 页
字号:

            DAT_copy(frame2 + i* (capLinePitch ), 
                     disFrameBuf->frame.iFrm.y1 + (2*i+1) * (disLinePitch),
                     numPixels);
                     
              
          DAT_copy(capFrameBuf->frame.iFrm.cb1 + (i+287) * (capLinePitch >> 1), 
                     disFrameBuf->frame.iFrm.cb1 + (2*i+1) * (disLinePitch >> 1),
                     numPixels>>1);

            DAT_copy(capFrameBuf->frame.iFrm.cr1 + (i+287) * (capLinePitch >> 1), 
                     disFrameBuf->frame.iFrm.cr1 + (2*i+1) * (disLinePitch >> 1),
                  numPixels>>1);                  
       } 
     
       DAT_wait(DAT_XFRID_WAITALL);   
      //  //=============================works now ===========================================================    
    
   
if(0x00==(CPLD_REG[8]&0x80)) //自动搜索
{ 
     if(1==NEEDIMG_FIND)
     {
    //  Tr=mia(frame2);
	//   IMG_thr_le2min(frame2,BIN, WIDTH, HEIGHT,Tr);
       findrlt=find_object(frame2,100,&leftx,&lefty,&rightx,&righty);
	   if(1==findrlt)
	  {
	  PRED=160;
	   NEEDIMG_FIND=0;
	   TEMWIDTH=(rightx-leftx+1);
	   TEMHEIGHT=(righty-lefty+1);
	   portdoor1.x=(leftx>10)?(leftx-10):0;
       portdoor1.y=(lefty>6)?(lefty-6):0;
       portdoor2.x=(rightx>502)?512:(rightx+10);
       portdoor2.y=(righty>281)?287:(righty+6);
	   
	   prd_leftx[0]=prd_leftx[1];
	   prd_lefty[0]=prd_lefty[1];
	   prd_leftx[1]=prd_leftx[2];
	   prd_lefty[1]=prd_lefty[2]; 
	   prd_leftx[2]=leftx;
	   prd_lefty[2]=lefty;
	   	
	  // if((TEMWIDTH*TEMWIDTH)>10000)
	   //portmode=1;
    //  if((templa_change==1)&&((TEMWIDTH*TEMWIDTH)<10000))//更新模板
	if((TEMWIDTH*TEMHEIGHT)<10000)//更新模板
      {    
        PORTMODE=0;
        for(i=0;i<TEMHEIGHT;i++)
        {
        for(j=0;j<TEMWIDTH;j++)
          {
          TEMPLATE[TEMWIDTH*i+j]=frame2[((lefty+i)<<9)+leftx+j];
          }
        }
		//templa_change=0;
       }
	   
	   else
	     {

	   PORTMODE=1;//目标太大,转为形心跟踪
	   matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x0,&y0);
	   }
	  }
     }//全场搜索完毕
     else //波门内搜索开始
      {
	   if(0==PORTMODE)//模板匹配模式
	   {
        findrlt=wnd_find(TEMPLATE, (frame2+((portdoor1.y*WIDTH)+portdoor1.x)),TEMWIDTH,TEMHEIGHT,&offx,&offy);
		if(1==findrlt)
		 {
          leftx=portdoor1.x+offx;
          lefty=portdoor1.y+offy;
          rightx=leftx+TEMWIDTH-1;
          righty=lefty+TEMHEIGHT-1;
	   portdoor1.x=(leftx>10)?(leftx-10):0;
       portdoor1.y=(lefty>6)?(lefty-6):0;
       portdoor2.x=(rightx>502)?512:(rightx+10);
       portdoor2.y=(righty>281)?287:(righty+6);	  
       prd_leftx[0]=prd_leftx[1];
	   prd_lefty[0]=prd_lefty[1];
	   prd_leftx[1]=prd_leftx[2];
	   prd_lefty[1]=prd_lefty[2]; 
	   prd_leftx[2]=leftx;
	   prd_lefty[2]=lefty;
	   PRED=160;
	   NEEDIMG_FIND=0;
		 }
		 else
		 {
		 //预测预测值
		prd_leftx[2]=(prd_leftx[1]<<1)-prd_leftx[0];
	   prd_lefty[2]=(prd_lefty[1]<<1)-prd_lefty[0];
	  prd_leftx[0]=prd_leftx[1];
	   prd_lefty[0]=prd_lefty[1];
	   prd_leftx[1]=prd_leftx[2];
	   prd_lefty[1]=prd_lefty[2]; 
       portdoor1.x=(prd_leftx[2]>10)?(prd_leftx[2]-10):0;
       portdoor1.y=(prd_lefty[2]>6)?(prd_lefty[2]-6):0;
       portdoor2.x=((TEMWIDTH+prd_leftx[2])>502)?512:(TEMWIDTH+prd_leftx[2]+10);
       portdoor2.y=((TEMHEIGHT+prd_lefty[2])>281)?287:(TEMHEIGHT+prd_lefty[2]+6);
	   PRED--;
	   if(0==PRED)
	   NEEDIMG_FIND=1;
		 }
		}//匹配结束
		
		else
		{
		matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x1,&y1);
		leftx=leftx+x1-x0;
		lefty=lefty+y1-y0;
        rightx=rightx+x1-x0;
        righty=righty+y1-y0;
		x0=x1;y0=y1;
	   portdoor1.x=(leftx>10)?(leftx-10):0;
       portdoor1.y=(lefty>6)?(lefty-6):0;
       portdoor2.x=(rightx>502)?512:(rightx+10);
       portdoor2.y=(righty>281)?287:(righty+6);
		}

     }
 }  //end auto search
else  //手工指定搜索
 {
   //extra code here
      Tr=mia(frame2);
	  IMG_thr_le2min(frame2,BIN, WIDTH, HEIGHT,Tr);
	  x=(((int32)CPLD_REG[9])<<8)+(int32)CPLD_REG[10];
	  y=(((int32)CPLD_REG[11])<<8)+(int32)CPLD_REG[12];
      findrlt=manual_find(BIN, Tr,x, y,&leftx,&lefty,&rightx,&righty);
	   if(1==findrlt)
	  {
	  PRED=160;
	   NEEDIMG_FIND=0;
          TEMWIDTH=rightx-leftx+1;
          TEMHEIGHT=righty-lefty+1;
        
	   portdoor1.x=(leftx>10)?(leftx-10):0;
       portdoor1.y=(lefty>6)?(lefty-6):0;
       portdoor2.x=(rightx>502)?512:(rightx+10);
       portdoor2.y=(righty>281)?287:(righty+6);
	   prd_leftx[0]=prd_leftx[1];
	   prd_lefty[0]=prd_lefty[1];
	   prd_leftx[1]=prd_leftx[2];
	   prd_lefty[1]=prd_lefty[2]; 
	   prd_leftx[2]=leftx;
	   prd_lefty[2]=lefty;
       }
	   if((TEMWIDTH*TEMHEIGHT)<10000)//更新模板
      {    
       PORTMODE=0;
        for(i=0;i<TEMHEIGHT;i++)
        {
        for(j=0;j<TEMWIDTH;j++)
          {
          TEMPLATE[TEMWIDTH*i+j]=frame2[((lefty+i)<<9)+leftx+j];
          }
        }
		//templa_change=0;
       }
	   
	  else
	     {

	   PORTMODE=1;//目标太大,转为形心跟踪
	     matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x0,&y0);
	  // matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),TEMWIDTH,TEMHEIGHT,&x0,&y0);
	   }
   } //manual search end
   
//D3=((((leftx+rightx)>>1)-256)>0)?1:0;
//D4=((((leftx+rightx)>>1)-256)>0)?1:0;
       tempx=((leftx+rightx)>>1)-256;
       tempy=((lefty+righty)>>1)-144;
	   reg1=(tempx<0)?reg1:(reg1&0xf7);
	   reg1=(tempy>0)?reg1:(reg1&0xfb);
	   tempx=abs(tempx);
	   tempy=abs(tempy);
	   reg1=reg1|((uint8)((tempx&0x0001)<<1));
	   reg1=reg1|((uint8)(tempy&0x0001));
	   reg1=reg1|(uint8)(findrlt<<6);
       //c_mx,c_lx,c_my,c_ly;
       
        c_mx=(tempx>>4);
        c_lx=tempx&0x000f;
        c_my=(tempy>>4);
        c_ly=tempy&0x000f;

       GPIO_pinWrite(mygpiohandle,GPIO_PIN4,1);
        /*  tempq1=rightx-leftx;
          tempq2=righty-lefty;
		  q1=(tempq1>0xFF)?0xFF:tempq1;
		  q2=(tempq2>0xFF)?0xFF:tempq2;
	      reg6=q1;
	      reg7=q2;*/
        
		  RAM2=(tempx>>1); 
		  RAM3=(tempy>>1);
          
          
          RAM1=reg1;

   //caculate L
   if(CPLD_REG[15]==0xFF&&CPLD_REG[14]==0xFF)
   {      
	   LH5=16;
       LH4=16;
       LH3=16;
       LH2=16;
       LH1=16;
   }
   else
   {      
	   L=CPLD_REG[15]*256+CPLD_REG[14];
	   LH5=L/10000; tempLH5=L%10000;
       LH4=tempLH5/1000; tempLH4=tempLH5%1000;
       LH3=tempLH4/100; tempLH3=tempLH4%100;
       LH2=tempLH3/10;  tempLH2=tempLH3%10;
       LH1=tempLH2;
   }

   //caculate beit,gama
   if(CPLD_REG[19]==0xFF&&CPLD_REG[18]==0xFF)
   {   
       gamaH4=16;
       gamaH3=16;
       gamaH2=16;
       gamaH1=16;
       gamapoint=16;
       gamaL1=16;
       gamaL2=16;
   }
   else
   {
       tempgama=(CPLD_REG[19]&0x7F)*256+CPLD_REG[18];
       gama=tempgama/4;
       gamaH4=gama/1000; tempgamaH4=gama%1000;
       gamaH3=tempgamaH4/100; tempgamaH3=tempgamaH4%100;
       gamaH2=tempgamaH3/10;  tempgamaH2=tempgamaH3%10;
       gamaH1=tempgamaH2; 
	   gamapoint=17;
       i=CPLD_REG[18]&0x03;   
       switch(i)
       {
         case 0:gamaL1=0; gamaL2=0;  break; 
         case 1:gamaL1=2; gamaL2=5;  break; 
         case 2:gamaL1=5; gamaL2=0;  break; 
         case 3:gamaL1=7; gamaL2=5;  break;    
         default:    break;       
       } 

   }
   if(CPLD_REG[17]==0xFF&&CPLD_REG[16]==0xFF)
   {
	   beitH4=16;
	   beitH3=16;
	   beitH2=16;
	   beitH1=16;
	   beitpoint=16;
	   beitL1=16;
  	   beitL2=16;
   }
   else
   {
	   tempbeit=(CPLD_REG[17]&0x7F)*256+CPLD_REG[16]; 
	   beit=tempbeit/4;
	   beitH4=beit/1000; tempbeitH4=beit%1000;
	   beitH3=tempbeitH4/100; tempbeitH3=tempbeitH4%100;
	   beitH2=tempbeitH3/10;  tempbeitH2=tempbeitH3%10;
	   beitH1=tempbeitH2;
	   beitpoint=17;
	   i=CPLD_REG[16]&0x03;
       switch(i)
       {
         case 0:beitL1=0; beitL2=0;  break; 
         case 1:beitL1=2; beitL2=5;  break; 
         case 2:beitL1=5; beitL2=0;  break; 
         case 3:beitL1=7; beitL2=5;  break; 
         default:    break;
       }	   
   }            
		  
          GPIO_pinWrite(mygpiohandle,GPIO_PIN4,0);
 //#######################################################################
        //draw cross 
        //m=(lefty+righty)<<9;
         m=((leftx+rightx)>>1)+((lefty+righty)<<9);
           memset(disFrameBuf->frame.iFrm.y1+m-20,0xff,40);
          for(i=0;i<40;i++)
         {*(disFrameBuf->frame.iFrm.y1+m+(i<<9)-10240)=0xff;}
           
     // DAT_copy(sour,disFrameBuf->frame.iFrm.y1+m-20,40);
     // DAT_copy2d(DAT_1D2D,sour,disFrameBuf->frame.iFrm.y1+m-512*20,1,40,512);
      
      
      // draw x,y
        
    for(i=0;i<15;i++)
       {
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+112] )=_amemd8_const(&numx[i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+128] )=_amemd8_const(&numptr[c_mx][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+144] )=_amemd8_const(&numptr[c_lx][i<<3]); 
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+176] )=_amemd8_const(&numy[i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+192] )=_amemd8_const(&numptr[c_my][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+208] )=_amemd8_const(&numptr[c_ly][i<<3]); 
        
        }          
    // draw L
	for(i=0;i<15;i++)
	{
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+300] )=_amemd8_const(&numl[i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+316] )=_amemd8_const(&numequ[i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+332] )=_amemd8_const(&numptr[LH5][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+348] )=_amemd8_const(&numptr[LH4][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+364] )=_amemd8_const(&numptr[LH3][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+380] )=_amemd8_const(&numptr[LH2][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+396] )=_amemd8_const(&numptr[LH1][i<<3]);
	}

    // draw gama,beit  
    for(i=0;i<15;i++)
	{
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+172] ) =_amemd8_const(&numbeit[i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+188] ) =_amemd8_const(&numequ[i<<3]);
		 if(CPLD_REG[17]==0xFF&&CPLD_REG[16]==0xFF)
		 {
           _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+204] ) =_amemd8_const(&numptr[16][i<<3]);
		 }
         else if(CPLD_REG[17]>127)
         {
           _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+204] ) =_amemd8_const(&numminus[i<<3]);
         }
         else
         {
           _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+204] ) =_amemd8_const(&numadd[i<<3]);
         }
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+220] ) =_amemd8_const(&numptr[beitH4][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+236] ) =_amemd8_const(&numptr[beitH3][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+252] ) =_amemd8_const(&numptr[beitH2][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+268] ) =_amemd8_const(&numptr[beitH1][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+284] ) =_amemd8_const(&numptr[beitpoint][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+300] ) =_amemd8_const(&numptr[beitL1][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+316] ) =_amemd8_const(&numptr[beitL2][i<<3]);
         // beta over;next gama        
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+348] ) =_amemd8_const(&numgama[i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+364] ) =_amemd8_const(&numequ[i<<3]);
       	 if(CPLD_REG[19]==0xFF&&CPLD_REG[18]==0xFF)
		 {
           _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+380] ) =_amemd8_const(&numptr[16][i<<3]);
		 }
		 else if (CPLD_REG[19]>127)
		 {
           _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+380] ) =_amemd8_const(&numminus[i<<3]);
		 }
         else 
		 {
           _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+380] ) =_amemd8_const(&numadd[i<<3]);
		 }
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+396] ) =_amemd8_const(&numptr[gamaH4][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+412] ) =_amemd8_const(&numptr[gamaH3][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+428] ) =_amemd8_const(&numptr[gamaH2][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+444] ) =_amemd8_const(&numptr[gamaH1][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+460] ) =_amemd8_const(&numptr[gamapoint][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+476] ) =_amemd8_const(&numptr[gamaL1][i<<3]);
         _amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+492] ) =_amemd8_const(&numptr[gamaL2][i<<3]);
	} 

	// draw portdoor
	p1=1024*portdoor1.y+portdoor1.x;
	p2=1024*portdoor2.y+portdoor2.x;
	memset(disFrameBuf->frame.iFrm.y1+p1,0xff,8);
	for(i=0;i<8;i++)
    {*(disFrameBuf->frame.iFrm.y1+p1+(i<<9))=0xff;}
	memset(disFrameBuf->frame.iFrm.y1+p2-7,0xff,8);
	for(i=0;i<8;i++)
	{*(disFrameBuf->frame.iFrm.y1+p2-4096+(i<<9))=0xff;}
	   



 
CACHE_wbInvAllL2(CACHE_WAIT);

         DAT_wait(DAT_XFRID_WAITALL);  
       
        FVID_exchange(capChan, &capFrameBuf);
    
          //-----------------------------------------------------------------------------------------------

        FVID_exchange(disChan, &disFrameBuf);        
        frames ++;              
   }
}


void readdata()
{
  uint8 a=0;
  a=ADDR_ADDR;
  CPLD_REG[a]=DAT_DAT;
}

⌨️ 快捷键说明

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