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

📄 dm642main.c

📁 DM642算法例程 图像处理 基于DSPBIOS
💻 C
字号:
/********************************************************************/
/*  Copyright 2004 by BTECH Incorporated.							*/
/*  All rights reserved. Property of BTECH Incorporated.				*/
/*  Restricted rights to use, duplicate or disclose this code are	*/
/*  granted through contract.									    */
/*  															    */
/********************************************************************/


/********************************************************************/
/*                     灰度的线性变换                               */
/*                    Db=intFA*Da+intFB;                            */
/********************************************************************/


#include <csl.h>
#include <csl_emifa.h>
#include <csl_i2c.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_dat.h>
#include <csl_cache.h>
#include "iic.h"
#include "vportcap.h"
#include "vportdis.h"
#include "TVP51xx.h"
#include "TVP51xx.h"
#include "evmdm642.h"
#include "saa7105.h"


#define COLOR_DISP //是否彩色显示

int portNumber;

/*图像句柄的声明*/
VP_Handle vpHchannel0;
VP_Handle vpHchannel1;
VP_Handle vpHchannel2;

/*确定图像的参数*/
const int numPixels = 720;//每行720个像素
const int numLines  = 576;//每帧576行(PAL)
const int flamesize = 720*576;

/*线性变换参数设置*/
int intFA = 2;      //斜率
int intFB = -128;   //截距

/*确定处理的范围*/
/*A             */
/*              */
/*             D*/ 
const int intAPixels = 190;
const int intALines = 59;
const int intDPixels = 530;
const int intDLines = 229; 

/*****画矩形边框函数的声明*****/
void drawRectangle();
/*****进行灰度均衡处理*********/
void inteEqualize();



extern	Uint8 capChaAYSpace[720*588]; 
extern	Uint8 capChaACbSpace[360*588]; 
extern	Uint8 capChaACrSpace[360*588];
extern	Uint8 disChaAYSpace[720*588]; 
extern	Uint8 disChaACbSpace[360*588]; 
extern	Uint8 disChaACrSpace[360*588];

#pragma DATA_SECTION(tmpChaAYSpace, ".external") 
Uint8 tmpChaAYSpace[720*588];
#pragma DATA_SECTION(tmpChaACbSpace, ".external") 
Uint8 tmpChaACbSpace[360*588];
#pragma DATA_SECTION(tmpChaACrSpace, ".external") 
Uint8 tmpChaACrSpace[360*588];

/*采集与显示缓冲区的首址*/
Uint32 capYbuffer  ;
Uint32 capCbbuffer ;
Uint32 capCrbuffer ;

Uint32 disYbuffer  ;
Uint32 disCbbuffer ; 
Uint32 disCrbuffer ;

Uint32 tempYbuffer ;    //临时
Uint32 tempCbbuffer ;   //临时
Uint32 tempCrbuffer ;   //临时

/*图像格式标志*/
Uint8 NTSCorPAL = 0;
extern far void vectors();
extern volatile Uint32 capNewFrame;
extern volatile Uint32 disNewFrame;

int i,j;
int intTemp;
	
Uint8 grayMap[256];  //灰度映射表
int intCount[256];   //第i级灰度计数
 
Int intArea ;  		//面积(总的像素)

/*此程序可将四个采集口的数据经过Video Port0送出*/
void main()
{

	int i;	
//	int dp_id,dp_id2;
	sysinit();
/*----------------------------------------------------------*/
	capYbuffer =  (Uint32)capChaAYSpace; 
	capCbbuffer = (Uint32)capChaACbSpace; 
	capCrbuffer = (Uint32)capChaACrSpace;
	disYbuffer  = (Uint32)disChaAYSpace;
	disCbbuffer = (Uint32)disChaACbSpace; 
	disCrbuffer = (Uint32)disChaACrSpace;
	tempYbuffer = (Uint32)tmpChaAYSpace;
	tempCbbuffer = (Uint32)tmpChaACbSpace;
	tempCrbuffer = (Uint32)tmpChaACrSpace;
/*----------------------------------------------------------*/
/*将Vedio Port1设为采集输入*/
	portNumber = 1;
	vpHchannel1 = bt656_8bit_ncfc(portNumber);
	bt656_capture_start(vpHchannel1);
	/*等待第一帧数据采集完成*/
	while(capNewFrame == 0){}
	/*将数据存入显示缓冲区,并清采集完成的标志*/
	capNewFrame =0;
	for(i=0;i<numLines;i++)
	{
		/*传送临时Y缓冲区*/
		DAT_copy((void *)(capYbuffer + i * numPixels), 
	             (void *)(tempYbuffer + i * numPixels),
	             numPixels);			  
	 }

    /*画边框*/    
    drawRectangle(); 
    
	/*进行灰度均衡处理*/
	inteEqualize();
	 
	for(i=0;i<0x33ae0;i++)
	{
	    *((Uint8 *)(disCrbuffer +i)) =0x80;
	    *((Uint8 *)(disCbbuffer +i)) =0x80;

	}

    for(i=0;i<numLines;i++)
	{
		/*传送Y缓冲区*/
	    DAT_copy((void *)(tempYbuffer + i * numPixels), 
	             (void *)(disYbuffer + i * numPixels),
	             numPixels);			 
	 }		 
	   
	/*启动显示模块*/
	bt656_display_start(vpHchannel2);
	/*建立显示的实时循环*/
	for(;;)
	{
		/*当采集区的数据已经采集好,而显示缓冲区的数据已空*/
		if(capNewFrame == 1)
		{
			/*将数据装入显示缓冲区,并清采集完成的标志*/
			capNewFrame =0;
			for(i=0;i<numLines;i++)
			{
				/*传送临时Y缓冲区*/
				DAT_copy((void *)(capYbuffer + i * numPixels), 
			             (void *)(tempYbuffer + i * numPixels),
			             numPixels);

			   #ifdef COLOR_DISP //是否彩色显示
				/*传送Cb缓冲区*/
			   DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)), 
			             (void *)(disCbbuffer + i * (numPixels >> 1)),
			             numPixels>>1);
				/*传送Cr缓冲区*/
			   DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)), 
			             (void *)(disCrbuffer + i * (numPixels >> 1)),
			             numPixels>>1);
				#endif          			   
			 }
			 DAT_wait(DAT_XFRID_WAITALL);				    
		    /*画边框*/    
		    drawRectangle(); 	
		   
		 	/*进行灰度均衡处理*/
			inteEqualize();
		}
		if(disNewFrame == 1)
		{	
			disNewFrame = 0;
	        for(i=0;i<numLines;i++)
			{
				/*传送Y缓冲区*/
			    DAT_copy((void *)(tempYbuffer + i * numPixels), 
			             (void *)(disYbuffer + i * numPixels),
			             numPixels);			             			 
			 }
			 DAT_wait(DAT_XFRID_WAITALL);			
		 
		}
		EVMDM642_GPIO_ledblink();//led blink for every frame.
		
	}
	
	for(;;)
	{}
  /*----------------------------------------------------------*/
	/*采集与回放*/
		
}  



/*画矩形边框函数的定义*/
void drawRectangle()
{
    int i,j;
    /*画上边*/
    //奇数行
    for(i=intALines-4;i<intALines;i++)  //边框长度
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) //奇数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}	
	
	//偶数行
	for(i=numLines/2+intALines-4;i<numLines/2+intALines;i++)  //边框长度
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) //偶数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}


	/*画下边*/
	//奇数行
    for(i=intDLines;i<intDLines+4;i++)//边框长度
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) //奇数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	//偶数行
	for(i=numLines/2+intDLines;i<numLines/2+intDLines+4;i++)//边框长度
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) //偶数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}	

	
	/*画左边*/
	//奇数行
    for(i=intALines;i<intDLines;i++)//边框长度
	{
	    for(j=intAPixels-6;j<intAPixels;j++) //奇数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	//偶数行
	for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)//边框长度
	{
	    for(j=intAPixels-6;j<intAPixels;j++) //偶数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	
	/*画右边*/
	//奇数行
    for(i=intALines;i<intDLines;i++)//边框长度
	{
	    for(j=intDPixels;j<intDPixels+6;j++) //奇数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	//偶数行
    for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)//边框长度
	{
	    for(j=intDPixels;j<intDPixels+6;j++) //偶数行边框宽度
	    {
	    	 *(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
	    }
	}
} 

/*进行灰度均衡处理*/
void inteEqualize()
{
	
	 intArea = (intDPixels-intAPixels)*(intDLines-intALines)*2;  //面积(总的像素)
	/*重置计数为0*/ 
	for(i=0;i<256;i++)
	{
		//清零
		intCount[i]=0;		
	}	 
	 
	/*计算各个灰度值得计数*/
	//方框内奇数行
	for(i=intALines;i<intDLines;i++)
	{
	    for(j=intAPixels;j<intDPixels;j++) 
	    {		
            intTemp = *(Uint8 *)(tempYbuffer + i*numPixels + j);          
		    //计数加1
		    intCount[intTemp]++;   
		}	 
	}
	
	//方框内偶数行
	for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)
	{
	    for(j=intAPixels;j<intDPixels;j++) 
	    {		
            intTemp = *(Uint8 *)(tempYbuffer + i*numPixels + j);          
		    //计数加1
		    intCount[intTemp]++;  
		}	 
	}
	
	/*计算灰度映射表*/
	for(i=0;i<256;i++)
	{
		//初始化为0
		intTemp = 0;
		for(j=0;j<=i;j++)
		{
			intTemp+=intCount[j];
		}
		//计算对应的新灰度值
		grayMap[i] = (Uint8)(intTemp*255/intArea);
	}
	
	/*进行灰度均衡,重新赋值*/
	//方框内奇数行

	for(i=intALines;i<intDLines;i++)
	{
	    for(j=intAPixels;j<intDPixels;j++) 
	    {		
            intTemp = *(Uint8 *)(tempYbuffer + i*numPixels + j);          
		    //赋新的灰度值
		    *(Uint8 *)(tempYbuffer + i*numPixels + j) = grayMap[intTemp]; 
		}	 
	}
	//方框内偶数行
	for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)
	{
	    for(j=intAPixels;j<intDPixels;j++) 
	    {		
            intTemp = *(Uint8 *)(tempYbuffer + i*numPixels + j);          
		    //赋新的灰度值
		    *(Uint8 *)(tempYbuffer + i*numPixels + j) = grayMap[intTemp];  
		}	 
	}	
}


 

⌨️ 快捷键说明

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