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

📄 video_ntsc_pal.c

📁 dm642上实现运动目标检测与跟踪
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <std.h>
#include <tsk.h>  
#include <sem.h>   
#include <gio.h>
#include <csl_dat.h>
#include <csl_cache.h>
#include <csl_gpio.h>

#include <math.h>  
#include <fvid.h>
#include <edc.h>
#include <vport.h>
#include <vportcap.h>
#include <vportdis.h>
#include <saa7105.h>
#include <saa7115.h>    
#include <evmdm642.h>
#include "typedef.h"
#include <stdio.h>
#include "evmdm642_vcapparams.h"
#include "evmdm642_vdisparams.h"   
#include "alg.h"
#include "img_thr_le2min.h"
#define save_file 0
#define TIME 80
/* heap IDs defined in the BIOS configuration file */
extern Int EXTERNALHEAP;
//#define MAXTEMPLETEWID 100
//#define MAXTEMPLETEHEI 100
#pragma DATA_SECTION(TEMPLATE,       ".INTPROCBUFF");
#pragma DATA_ALIGN(TEMPLATE,        4);
uint8 TEMPLATE[MAXTEMPLETEWID*MAXTEMPLETEHEI];

#pragma DATA_SECTION(CPLD_REG,       ".INTPROCBUFF");
#pragma DATA_ALIGN(CPLD_REG,    4);
static volatile  uint8  CPLD_REG[32];

#pragma DATA_SECTION(BIN,       ".EXTPROCBUFF");
#pragma DATA_ALIGN(BIN,    128);
static   uint8  BIN[WIDTH*HEIGHT];

extern  const uint8 num0[120];
extern  const uint8 num1[120];
extern  const uint8 num2[120];
extern  const uint8 num3[120];
extern  const uint8 num4[120];
extern  const uint8 num5[120];
extern  const uint8 num6[120];
extern  const uint8 num7[120];
extern  const uint8 num8[120];
extern  const uint8 num9[120];
extern  const uint8 numa[120];
extern  const uint8 numb[120];
extern  const uint8 numc[120];
extern  const uint8 numd[120];
extern  const uint8 nume[120];
extern  const uint8 numf[120];
extern  const uint8 numx[120];
extern  const uint8 numy[120];
extern  const uint8 numl[120];
extern  const uint8 numbeit[120];
extern  const uint8 numgama[120];
extern  const uint8 numblank[120];
extern  const uint8 numpoint[120];
extern  const uint8 numminus[120];
extern  const uint8 numadd[120];
extern  const uint8 numequ[120];

static const uint8 * numptr[18]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,numa,numb,numc,numd,nume,numf,numblank,numpoint};
  
 GPIO_Config MyConfig = {
  0x00000031, /* gpgc */
  0x00000038, /* gpen */
  0x00000018, /* gdir */
  0x000000ff, /* gpval */
  0x00000000, /* gphm */
  0x00000000, /* gplm */
  0x00000030  /* gppol */
  };  
  GPIO_Handle  mygpiohandle;                    
                  
main()                 
{                      
    CSL_init();                                             
    CACHE_clean(CACHE_L2ALL, 0, 0);
    CACHE_setL2Mode(CACHE_128KCACHE);       
    CACHE_enableCaching(CACHE_EMIFA_CE00);
    CACHE_enableCaching(CACHE_EMIFA_CE01);
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
    mygpiohandle = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);        
    GPIO_config(mygpiohandle,&MyConfig);  
    GPIO_pinWrite(mygpiohandle,GPIO_PIN4,1);
    IRQ_disable(IRQ_EVT_EXTINT5);
    IRQ_reset(IRQ_EVT_EXTINT5);
    IRQ_enable(IRQ_EVT_EXTINT5);
//   memset(sour,0xff,40);
}

/*
 * ======== tskVideoLoopback ========
 * video loopback function.
 */
void tskVideoLoopback()
{  
#if save_file  //for test
     FILE *fp;
     char *name="d:\\1.dat";
#endif
//int32 size;
//int32 c0,y0,c1,y1;
    int32 m,i,j;
    int32  leftx,lefty,rightx,righty,tempx,tempy;
	
    int32 c_mx,c_lx,c_my,c_ly;
    int32 status;
	int32 x,y;
	int32 x0,y0,x1,y1;
    int32 Tr;
    int32 offx,offy;
    FVID_Handle disChan; 
    int32 frames = 0;
    FVID_Frame *disFrameBuf;
    int32 TEMWIDTH;
    int32 TEMHEIGHT;
    point portdoor1,portdoor2;
	int prd_leftx[3],prd_lefty[3];
   //--------------------------------------------------------------------------------------------------------------------------------------------------------------------
   // 工作模式选择
    int32 findrlt=0;//找到与否
	//int32 TEMPLA_CHANGE=1;//为1表示更新模板,为0表示不更新
	int32 PORTMODE=0;   //0为模板匹配跟踪,1为形心跟踪
	int32 NEEDIMG_FIND=1; // 1表示将要全场搜索,1则为波门内搜索
	int32 PRED=160;//为0后则进行全场搜索
	
	uint8 reg1=0x1c;
	//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
   // Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
   Int numLines=EVMDM642_vDisParamsChan.imgVSizeFld1;
    FVID_Handle capChan; 
    int32 numPixels = EVMDM642_vCapParamsChan.fldXStop1 - 
       EVMDM642_vCapParamsChan.fldXStrt1+1;
    FVID_Frame *capFrameBuf;
    int32 capLinePitch = EVMDM642_vCapParamsChan.fldXStop1 - 
       EVMDM642_vCapParamsChan.fldXStrt1+1;
    int32 disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;
  //  numLines *= 2; /* both fields */
    /******************************************************/
    /* allocate both capture and display frame buffers    */
    /* in external heap memory                            */
    /******************************************************/
        EVMDM642_vCapParamsChan.segId = EXTERNALHEAP;
        EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;
        EVMDM642_vDisParamsSAA7105.hI2C = EVMDM642_I2C_hI2C;
        EVMDM642_vCapParamsSAA7115.hI2C = EVMDM642_I2C_hI2C;

    /******************************************************/
    /* initialization of capture driver                   */
    /******************************************************/

    capChan = FVID_create("/VP0CAPTURE/A/0", 
            IOM_INPUT, &status, (Ptr)&EVMDM642_vCapParamsChan, NULL);

     
    /******************************************************/
    /* initialization of display driver                   */
    /******************************************************/
    disChan = FVID_create("/VP2DISPLAY", IOM_OUTPUT, 
        &status, (Ptr)&EVMDM642_vDisParamsChan, NULL);

 
    /******************************************************/
    /* configure video encoder & decoder                  */
    /******************************************************/
    FVID_control(disChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
        (Ptr)&EVMDM642_vDisParamsSAA7105);

    FVID_control(capChan, VPORT_CMD_EDC_BASE + EDC_CONFIG, 
        (Ptr)&EVMDM642_vCapParamsSAA7115);
    /******************************************************/
    /* start capture & display operation                  */    
    /******************************************************/
    FVID_control(disChan, VPORT_CMD_START, NULL);

    FVID_control(capChan, VPORT_CMD_START, NULL);

    /********************************************************/
    /* request a frame buffer from display & capture driver */
    /********************************************************/
    FVID_alloc(disChan, &disFrameBuf);
    FVID_alloc(capChan, &capFrameBuf);   
    frames ++;
	
    while(1){/* loop forever */
        int32 i;
        int gama,beit,tempgama,tempbeit,tempgamaH4,tempgamaH3,tempgamaH2,tempbeitH4,tempbeitH3,tempbeitH2;   
        int gamaH4, gamaH3,gamaH2,gamaH1,gamaL1,gamaL2,beitH4,beitH3,beitH2,beitH1,beitL1,beitL2;
        int gamapoint,beitpoint,p1,p2;
		int L,LH5,LH4,LH3,LH2,LH1,tempLH5,tempLH4,tempLH3,tempLH2;
        
        unsigned char * frame1=capFrameBuf->frame.iFrm.y1;
      unsigned char  * frame2=capFrameBuf->frame.iFrm.y1+WIDTH*HEIGHT;
      
         CPLD_REG[17]=0xff;  
        CPLD_REG[16]=0xFF;
       CPLD_REG[19]=0xff;
       CPLD_REG[18]=0xFF;
       
//COPY ODD FIELD ==========================       
        for(i = 0; i < numLines; i ++) 
		{
          DAT_copy(frame1 + i * (capLinePitch ), 
                     disFrameBuf->frame.iFrm.y1 + 2*i * (disLinePitch),
                     numPixels);        
              
          DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1), 
                     disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch ),
                     numPixels>>1);

          DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1), 
                     disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch ),
                  numPixels>>1);         
       } 
       
    
     //   CACHE_wbInvL2(TEMPLATE,512*287,CACHE_WAIT);
 
   //=============================works now ===========================================================   
   
if(0x00==(CPLD_REG[8]&0x80)) //自动搜索
{ 
     if(1==NEEDIMG_FIND)
     {
    //  Tr=mia(frame1);
	   //IMG_thr_le2min(frame1,BIN, WIDTH, HEIGHT,Tr);
       findrlt=find_object(frame1,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*TEMHEIGHT)<10000)//更新模板
      {    
        PORTMODE=0;
        for(i=0;i<TEMHEIGHT;i++)
        {
        for(j=0;j<TEMWIDTH;j++)
          {
          TEMPLATE[TEMWIDTH*i+j]=frame1[((lefty+i)<<9)+leftx+j];
          }
        }
		//templa_change=0;
       }
	   
	   else
	     {

	   PORTMODE=1;//目标太大,转为形心跟踪
	   matr_cent((frame1+((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, (frame1+((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((frame1+((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(frame1);
	  IMG_thr_le2min(frame1,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]=frame1[((lefty+i)<<9)+leftx+j];
          }
        }
		//templa_change=0;
       }
	   
	  else
	     {

	   PORTMODE=1;//目标太大,转为形心跟踪
	     matr_cent((frame1+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x0,&y0);

	   }
   } //manual search end
   

       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);


       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);
		 
		  
		  
          GPIO_pinWrite(mygpiohandle,GPIO_PIN4,0);
 //COPY EVEN FIELD====================================================================================
        for(i = 0; i < numLines; i ++) {

⌨️ 快捷键说明

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