?? dm642main.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 + -