DM642学习笔记程序注释.docx

上传人:b****5 文档编号:4164196 上传时间:2022-11-28 格式:DOCX 页数:15 大小:19.74KB
下载 相关 举报
DM642学习笔记程序注释.docx_第1页
第1页 / 共15页
DM642学习笔记程序注释.docx_第2页
第2页 / 共15页
DM642学习笔记程序注释.docx_第3页
第3页 / 共15页
DM642学习笔记程序注释.docx_第4页
第4页 / 共15页
DM642学习笔记程序注释.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

DM642学习笔记程序注释.docx

《DM642学习笔记程序注释.docx》由会员分享,可在线阅读,更多相关《DM642学习笔记程序注释.docx(15页珍藏版)》请在冰豆网上搜索。

DM642学习笔记程序注释.docx

DM642学习笔记程序注释

张伟刚QQ:

263298490

用的是瑞泰创新的实验箱(ICETEK-DM642-IDK-M),主要是视频处理部分的程序注释及思考题思路。

DM642视频驱动程序的注释:

/*

*Copyright2003byTexasInstrumentsIncorporated.

*Allrightsreserved.PropertyofTexasInstrumentsIncorporated.

*Restrictedrightstouse,duplicateordisclosethiscodeare

*grantedthroughcontract.

*

*/

/*"@(#)DDK1.10.00.2307-02-03(ddk-b12)"*/

#include//如果使用C语言,必须将此文件作为第一个头文件

#include

#include

#include

#include

#include//使用CSL库,要用到的一些头文件,可参考CSL

#include//视频驱动头文件

#include

#include

#include

#include

#include

#include

#include//芯片头文件

#include"colorbar.h"//如果显示彩色滚动条,就必须有此头文件;否则不需要

#include"evmdm642_vcapparams.h"

#include"evmdm642_vdisparams.h"

/*heapIDsdefinedintheBIOSconfigurationfile*/

externIntEXTERNALHEAP;//ÔÚDSP/BIOSÖÐÒѶ¨Òå

/*

*========main========

*/

main()

{

/******************************************************/

/*openCSLDATmoduleforfastcopy*/

/******************************************************/

CSL_init();//调用任何CSL库中的函数,必须先在此调用函数

CACHE_clean(CACHE_L2ALL,0,0);//清洗Cache模式

CACHE_setL2Mode(CACHE_256KCACHE);//设置Cache模式

CACHE_enableCaching(CACHE_EMIFA_CE00);//使能EMIFACE0空间

CACHE_enableCaching(CACHE_EMIFA_CE01);//使能EMIFACE1空间

DAT_open(DAT_CHAANY,DAT_PRI_LOW,DAT_OPEN_2D);//打开数据传输

}

/*

*========tskVideoLoopback========

*videoloopbackfunction.

*/

voidtskVideoLoopback()

{

Inti;

intm_nWork;

Intstatus;

FVID_HandledisChan;//设置设备句柄

Intframes=0;

FVID_Frame*disFrameBuf;

IntnumLinesDis=EVMDM642_vDisParamsChan.imgVSizeFld1;

//设置显示的行数,VGA为480,PAL为576

IntnumLinesCap=EVMDM642_vCapParamsChan.fldYStop1-//设置采集行数

EVMDM642_vCapParamsChan.fldYStrt1+1;

/*判断是显示区域大,还是采集区域大,取其小者*/

IntnumLines=(numLinesDis>numLinesCap)?

numLinesCap:

numLinesDis;

#ifdef_LOOPBACK

FVID_HandlecapChan;

/*设置每行显示的像素数,PAL制为720*/

IntnumPixels=EVMDM642_vCapParamsChan.fldXStop1-

EVMDM642_vCapParamsChan.fldXStrt1+1;

FVID_Frame*capFrameBuf;

/*设置采集图像一行的总像素*/

IntcapLinePitch=EVMDM642_vCapParamsChan.fldXStop1-

EVMDM642_vCapParamsChan.fldXStrt1+1;

/*设置显示图像一行的总像素*/

IntdisLinePitch=EVMDM642_vDisParamsChan.imgHSizeFld1;

#ifdef_PIP

VPORTCAP_ParamsEVMDM642_vCapParamsChan2=EVMDM642_vCapParamsChan;

FVID_HandlecapChan2;

FVID_Frame*capFrameBuf2;

IntyPitch=capLinePitch>>1;

IntcPitch=((capLinePitch>>2)+7)&(~7);

#endif

#endif

numLines*=2;/*bothfields*/如果输出为PAL制,前面numLinesCap不要*2,这里再*2?

/******************************************************/

/*allocatebothcaptureanddisplayframebuffers*/

/*inexternalheapmemory*/

/******************************************************/

/*分配采集和显示图像的存放缓冲区*/

EVMDM642_vCapParamsChan.segId=EXTERNALHEAP;

EVMDM642_vDisParamsChan.segId=EXTERNALHEAP;

EVMDM642_vDisParamsSAA7105.hI2C=EVMDM642_I2C_hI2C;

EVMDM642_vCapParamsSAA7115.hI2C=EVMDM642_I2C_hI2C;

/******************************************************/

/*initializationofcapturedriver*/

/******************************************************/

/*建立并初始化采集设备对象*/

#ifdef_LOOPBACK

capChan=FVID_create("/VP0CAPTURE/A/0",

IOM_INPUT,&status,(Ptr)&EVMDM642_vCapParamsChan,NULL);

#ifdef_PIP

EVMDM642_vCapParamsChan2.scale=VPORT_SCALING_ENABLE;

EVMDM642_vCapParamsChan2.fldOp=VPORT_FLDOP_FLD1;

EVMDM642_vCapParamsChan2.thrld>>=1;

capChan2=FVID_create("/VP1CAPTURE/A/1",

IOM_INPUT,&status,(Ptr)&EVMDM642_vCapParamsChan2,NULL);

#endif

#endif

/******************************************************/

/*initializationofdisplaydriver*/

/******************************************************/

/*建立并初始化显示设备对象*/

disChan=FVID_create("/VP2DISPLAY",IOM_OUTPUT,

&status,(Ptr)&EVMDM642_vDisParamsChan,NULL);

/******************************************************/

/*configurevideoencoder&decoder*/

/******************************************************/

for(m_nWork=0;m_nWork<6;m_nWork++)//这里的循环有何用?

一直没有弄清楚

{

/*为保证采集和显示设备正常工作,为其设置驱动*/

FVID_control(disChan,VPORT_CMD_EDC_BASE+EDC_CONFIG,

(Ptr)&EVMDM642_vDisParamsSAA7105);

#ifdef_LOOPBACK

FVID_control(capChan,VPORT_CMD_EDC_BASE+EDC_CONFIG,

(Ptr)&EVMDM642_vCapParamsSAA7115);

#ifdef_PIP

EVMDM642_vCapParamsSAA7115.aFmt=SAA7115_AFMT_COMPOSITE;

FVID_control(capChan2,VPORT_CMD_EDC_BASE+EDC_CONFIG,

(Ptr)&EVMDM642_vCapParamsSAA7115);

#endif

#endif

}

/******************************************************/

/*startcapture&displayoperation*/

/******************************************************/

/*开始采集和显示操作*/

FVID_control(disChan,VPORT_CMD_START,NULL);

#ifdef_LOOPBACK

FVID_control(capChan,VPORT_CMD_START,NULL);

#ifdef_PIP

FVID_control(capChan2,VPORT_CMD_START,NULL);

#endif

#endif

/********************************************************/

/*requestaframebufferfromdisplay&capturedriver*/

/********************************************************/

/*分配采集和显示一帧图像存放的缓冲区*/

FVID_alloc(disChan,&disFrameBuf);

#ifdef_LOOPBACK

FVID_alloc(capChan,&capFrameBuf);

#ifdef_PIP

FVID_alloc(capChan2,&capFrameBuf2);

#endif

#endif

frames++;

while

(1){/*loopforever*/

#ifdef_LOOPBACK

/*copydatafromcapturebuffertodisplaybuffer*/

/***************************************************/

/*将采集缓冲区的内容复制到显示缓冲区*/

for(i=0;i

DAT_copy(capFrameBuf->frame.iFrm.y1+i*capLinePitch,

disFrameBuf->frame.iFrm.y1+i*disLinePitch,

numPixels);

DAT_copy(capFrameBuf->frame.iFrm.cb1+i*(capLinePitch>>1),

disFrameBuf->frame.iFrm.cb1+i*(disLinePitch>>1),

numPixels>>1);

DAT_copy(capFrameBuf->frame.iFrm.cr1+i*(capLinePitch>>1),

disFrameBuf->frame.iFrm.cr1+i*(disLinePitch>>1),

numPixels>>1);

}

#ifdef_PIP

for(i=0;i<(numLines>>1);i++){

DAT_copy(capFrameBuf2->frame.iFrm.y1+i*yPitch,

disFrameBuf->frame.iFrm.y1+i*disLinePitch

+(disLinePitch>>1),

(numPixels>>1));

DAT_copy(capFrameBuf2->frame.iFrm.cb1+i*cPitch,

disFrameBuf->frame.iFrm.cb1+i*(disLinePitch>>1)

+(disLinePitch>>2),

(numPixels>>2));

DAT_copy(capFrameBuf2->frame.iFrm.cr1+i*cPitch,

disFrameBuf->frame.iFrm.cr1+i*(disLinePitch>>1)

+(disLinePitch>>2),

(numPixels>>2));

}

#endif

DAT_wait(DAT_XFRID_WAITALL);

FVID_exchange(capChan,&capFrameBuf);//采集一帧图像

#ifdef_PIP

FVID_exchange(capChan2,&capFrameBuf2);

#endif

#else//如果定义CAPTURE则填充图像缓冲区为8条带

fillFrmBuf(&disFrameBuf->frame.iFrm,EVMDM642_vDisParamsChan.imgHSizeFld1,

EVMDM642_vDisParamsChan.imgVSizeFld1

+EVMDM642_vDisParamsChan.imgVSizeFld2,

frames%360);

#endif

FVID_exchange(disChan,&disFrameBuf);//将显示缓冲区中一帧图像送给显示设备

frames++;//处理下一帧图像

}

}

实验5.20视频图像处理-取反

1.将程序改成屏幕1/4进行取反,而其他不变

在主程序中ICETEKDM642PCIImageProcessReverse()函数前加if(i<(numLines/2)),即:

if(i<(numLines/2))

ICETEKDM642PCIImageProcessReverse();

并将ICETEKDM642PCIImageProcessReverse()函数中的循环体改为如下:

for(i=0;i<720/2;i++)

nMemTemp[i]=~nMemTemp[i];

2.例程中处理了亮度信号,以下是处理色差信号:

for(i=0;i

{

m_nID=DAT_copy(capFrameBuf->frame.iFrm.cb1+i*(capLinePitch>>1),nMemTemp,numPixels>>1);

DAT_wait(m_nID);

ICETEKDM642PCIImageProcessReverse();

DAT_copy(nMemTemp,disFrameBuf->frame.iFrm.cb1+i*(disLinePitch>>1),numPixels>>1);

for(m_nWork=0;m_nWork>1;m_nWork++)

nMemTemp[m_nWork]=0x080;

DAT_copy(nMemTemp,disFrameBuf->frame.iFrm.y1+i*disLinePitch,numPixels);DAT_copy(nMemTemp,disFrameBuf->frame.iFrm.cr1+i*(disLinePitch>>1),numPixels>>1);

}

出现的问题:

图像显示时右半屏有闪烁?

~~~

实验5.21视频图像处理-直方图统计

程序注释:

源程序中定义的js变量不知为何用,于是就删除了~~~

#include"ICETEK-DM642-PCI.h"

//工作变量

#pragmaDATA_SECTION(nMemTemp,".INTPROCBUFF");

#pragmaDATA_ALIGN(nMemTemp,128);

unsignedcharnMemTemp[720];

#pragmaDATA_SECTION(nHisto,".INTPROCBUFF");

#pragmaDATA_ALIGN(nHisto,128);

unsignedintnHisto[256];

unsignedcharimgHisto[HISTOHIGH*HISTOWIDTH];//128*256

intmi,mj,m_nWork1;

unsignedintm_nWork,*pWork;

unsignedchar*pImg,*pImg1;

voidICETEKDM642PCIBoardInit()//直方图显示区域初始化

{

for(mi=0;mi

imgHisto[mi]=1;

for(mi=0;mi<256;mi++)

nHisto[mi]=0;

}

#pragmaCODE_SECTION(ICETEKDM642PCIStatistic,".text1")

voidICETEKDM642PCIStatistic()//统计一帧图像的直方图

{

inti;

for(i=0;i<720;i++)

{

nHisto[nMemTemp[i]]++;

}

}

#pragmaCODE_SECTION(ICETEKDM642PCIHistogram,".text1")

voidICETEKDM642PCIHistogram()//将统计的一帧图像的直方图显示在显示区域上

{

m_nWork=0;

for(mi=0;mi<256;mi++)//找出各灰度级别像素总数最大的

if(m_nWork

m_nWork=nHisto[mi];

m_nWork/=(HISTOHIGH-1);//求出比例因子(即像素总数最大值/显示区域的高度)

for(mi=0;mi<256;mi++)//转换各灰度级,将其映射到显示区域(即:

各个灰度级的像素/比例因子)

{

nHisto[mi]/=m_nWork;

}

for(mi=0;mi

imgHisto[mi]=1;

pImg=imgHisto;//pImg指针指向显示区域首地址

pImg+=((HISTOHIGH-1)*HISTOWIDTH);//mImg指针指向显示区域尾地址

pImg++;//?

?

?

for(mi=1;mi<255;mi++,pImg++)

{

for(mj=0,pImg1=pImg;mj

(*pImg1)=HISTOCOLOR;//对应的显示区域填充颜色,这里还是不太明白

}

for(mi=0;mi<256;mi++)//清除直方图统计的数组

nHisto[mi]=0;

}

实验5.22视频图像处理-直方图均衡化增强

程序注释:

直方图均衡化,其实质是图像增强的一种。

#include"math.h"

#include"ICETEK-DM642-PCI.h"

//工作变量

#pragmaDATA_SECTION(nMemTemp,".INTPROCBUFF");

#pragmaDATA_ALIGN(nMemTemp,128);

unsignedcharnMemTemp[720];

#pragmaDATA_SECTION(fHisto,".INTPROCBUFF");

#pragmaDATA_ALIGN(fHisto,128);

floatfHisto[256];//

#pragmaDATA_SECTION(lut,".INTPROCBUFF");

#pragmaDATA_ALIGN(lut,128);

unsignedcharlut[256];//保存新的灰度级,是通过上一帧图像计算的

intmi,mj,m_nWork1;

unsignedintm_nWork,*pWork,js;

unsignedchar*pImg,*pImg1;

floatm_fWork;

voidICETEKDM642PCIBoardInit()

{

js

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1