原创 (转载)Sobel边缘提取算法(DSP)

2007-8-18 21:02 3532 2 7 分类: 处理器与DSP


1.  把数据从视频通道通过一维方式传送到片内RAM中并作Sobel边缘提取算法。

我们只对摄像头采集的一块数据进行Sobel边缘提取。采用一维EDMA传送方式,每一次传
送采集的一行中的部分数据(DAT_copy()函数)。在PAL制式下,先把一行数据放到
nMemTemp数组中,比如我们要把从144行到432行,从180列到435列的图像进行Sobel边缘
提取,最后把变换后的数据输出到显示缓冲区。     

unsigned char nMemTemp[720];

for ( i = 0; i < numLines; i ++ )   {  m_nID=DAT_copy(capFrameBuf-
>frame.iFrm.y1+i*capLinePitch,nMemTemp,numPixels);

     DAT_wait(m_nID);

     if ( i>144 && i<432 )

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

}

因为Sobel算法需要三行数据,我们可以开辟一个可以存放三行数据的缓冲区,通过指针
的交换把从视频通道过来的数据分别放到缓冲区中。保存的三行图像使用翻卷的缓冲区
管理,三个变量分别指示当前使用的y行、y-1行和y-2行在缓冲区中的起始偏移量。我们
可以这样来做:轮流往三块缓存区拷贝数据。只要拷贝的指针变化就可以。在我们拷贝
当前这一块的时候,已经拷贝的另外两块数据依然没有变化,所以我们就可以实现三块
数据保存采集图像中的相邻的三行数据。如下:

 

缓冲区1
 cLines[0-255]
 
缓冲区2
 cLines[256-512]
 
缓冲区3
 cLines[513-768]
 


               表 缓存区分配

三个指针*pImg1,*pImg2,*pImg3分别轮流指向三个缓冲区。

    m_nOffset1=0;

    m_nOffset2=256;

    m_nOffset3=512;

unsigned char cLines[256*3];

void Sobel()

{

    unsigned int m_nID;

    m_nID=DAT_copy(nMemTemp+180,cLines+m_nOffset3,256);

    pImg1=cLines; pImg1+=m_nOffset1;

    pImg2=cLines; pImg2+=m_nOffset2;

    pImg3=cLines; pImg3+=m_nOffset3;

    x1=(*pImg1); pImg1++; x2=(*pImg1); pImg1++;

    x4=(*pImg2); pImg2++; x5=(*pImg2); pImg2++;

    x7=(*pImg3); pImg3++; x8=(*pImg3); pImg3++;

    for ( mi=0;mi<256;mi++,pImg1++,pImg2++,pImg3++ )

    {

        x3=(*pImg1); x6=(*pImg2); x9=(*pImg3);

        m_nWork1=x7+x8+x8-x2-x2-x3;

        m_nWork2=x3+x6+x6-x4-x4-x7;

        if ( m_nWork1<m_nWork2 )

            m_nWork1=m_nWork2;

        m_nWork2=m_nWork1+x9-x1;

        if ( m_nWork2>255 ) m_nWork2=1;

        else if ( m_nWork2<0 )  m_nWork2=0;

        nMemTemp[mi+180]=m_nWork2;

        x1=x2; x2=x3;

        x4=x5; x5=x6;

        x7=x8; x8=x9;

    }

nMemTemp[mi]=0;

    m_nWork=m_nOffset1; m_nOffset1=m_nOffset2;

    m_nOffset2=m_nOffset3; m_nOffset3=m_nWork;

}

2.  把数据从视频通道通过二维方式传送到SDRAM中并作Sobel边缘提取算法。

我们可以通过DAT_copy2d()函数直接把采集的一幅图像亮度分量存放到SDRAM中,如下:

DAT_copy2d(DAT_2D2D,

                capFrameBuf->frame.iFrm.y1,

                    m_dbFrameBufferTemp,

                        numPixels,

                          numLines,

                            numPixels);

其中:m_dbFrameBufferTemp是指向SDRAM中缓冲区的指针,numPixels是一行的象素数,
numLines是行数。当把数据存放到SDRAM的一个数组中后,Sobel算法的实现就非常简单
了。当然也可以参照一维的方法来实现。

文章评论5条评论)

登录后参与讨论

用户312990 2011-4-5 17:27

这两个设置有什么区别啊? 用的是6455, 是从外面的FPGA的FIFO读数据1280。 不好意思啊,不知道它怎么不分行。

用户312990 2011-4-5 17:25

//------------------------------------------------ datSetup1.qchNum = CSL_DAT_QCHA_0;// QDMA channel number being requsted datSetup1.regionNum = CSL_DAT_REGION_GLOBAL; datSetup1.tccNum = 1; datSetup1.paramNum = 0;//parameter set number for this channel datSetup1.priority = CSL_DAT_PRI_0; DAT_open(&datSetup1); id = DAT_copy2d(DAT_2D1D,(Uint32 *)DSPR_EN_ADD_IC,(Uint32 *)(LINEDATA),4,320,0); DAT_wait(id); DAT_close();

用户312990 2011-4-5 17:25

请问一下, chan_num=1; param_num=chan_num; regin=1; queue_num=0; SetEdma3DCHMAP(chan_num, param_num); SetEdma3DRAE(regin,chan_num); // SetEdma3EESR(regin,chan_num); SetEdma3DMAQNUM(chan_num,queue_num); SetEdma3Opt(param_num, 0x8010100C); SetEdma3Src(param_num, DSPR_EN_ADD_IC); SetEdma3BCnt_ACnt(param_num, 0x01400004); SetEdma3Dst(param_num, (Uint32)LINEDATA); SetEdma3DstBidx_DstBidx(param_num, 0x00040000); SetEdma3BCNTRLD_LINK(param_num, 0x0000FFFF); SetEdma3DstCidx_SrcCidx(param_num, 0x00000000); SetEdma3Ccnt(chan_num, 0x00000001); SetEdma3IESR(regin, chan_num); SetEdma3ESR(1, 1); IPR_val=GetEdma3IPR(1,1); while(!(IPR_val & (1<<1))) IPR_val=GetEdma3IPR(1,1); SetEdma3ICR(1, 1);

用户414035 2010-11-17 11:09

不错

用户16535 2010-7-17 15:04

不错icon
相关推荐阅读
用户90712 2010-06-18 10:37
reset
Designing power-up reset sequence and reset structures in a chip is a critical task and there are ma...
用户90712 2010-02-02 21:59
FPGA书籍收藏[可免费下载]
1. Static Timing Analysis for Nanometer Designs详细介绍了时序分析的方方面面,例子丰富http://uploading.com/files/cd9a457...
用户90712 2008-10-04 16:35
CS gets with parallel program
Computer science is approaching a crisis that some CS experts say could fuel a renaissance of ideas....
用户90712 2008-09-26 19:15
c++ volatile用法(转)
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存...
用户90712 2008-05-21 14:30
电子系统EDA集成开发环境框架结构
EDA集成开发环境是电子系统或嵌入式系统开发必备的工具与手段,本文根据目前的EDA工具软件及其套件结构和电子系统的开发需要,提出了三种不同类型典型的EDA集成开发环境框架结构:板级电子系统EDA集成开...
用户90712 2008-04-28 15:19
GPU通用计算渐成热点,众厂商逐鹿未来高并行性计算市场
图形处理器(GPU)用于通用计算(GPGPU)及其相关方面的问题目前已成为一个热门话题。事实上,整个IT产业都已经敏锐地意识到了GPU通用计算将给PC带来革命性的变化,进而影响到CPU的发展。因此,无...
我要评论
5
2
关闭 站长推荐上一条 /2 下一条