您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]关于BF533/BF531的CMOS摄像头模块的实... 
本帖共有3229个阅读者
发表帖子 发表投票 回复主题
[求助]关于BF533/BF531的CMOS摄像头模块的实验
szuyiyu(论坛新手)
szuyiyu
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:244
积分:20
注册时间:2012/4/26
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]关于BF533/BF531的CMOS摄像头模块的实验

我刚买了COMS摄像头模块,想对摄像头采集的图像进行图像处理,不过对怎么分配图像缓冲区有些疑惑。我仿照图像处理例程里的代码,用malloc()来分配空间,这是我测试代码,在DMA_PPI中断函数里调用

//yuv422: Y0U0 Y1V0 Y2U1 Y3V1 Y4U2 Y5V2 ``````
void yuv2rgb(char *src)
{
   long i,j,k;
   char y,u,v;
   char r,g,b;
  
   char *dib_src=src;
  
   char *dib_new;  
   dib_new=(unsigned char *)malloc(640*480*3);
   for(i=0;i<480;i++)
   {
    for(j=0;j<640*3;j++)
    {
     *(dib_new+i*640*3+j)=0x24;
    }
   }  
}

只是对分配的空间写0x24,可是却影响到了采集到得图像,图像数据全被0x24覆盖了。

现在想请问一下几个问题:
1.这情况是什么原因呢?
2.malloc()是分配哪里的空间呢?最大能分配多少?
3.有什么方法来分配图像缓冲区来进行图像处理呢?

上传的图片
  20124261933831.jpg [ 7.50 KB 434×121 ] (缩略时请点击查看原图)

 




这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/4/26 19:04:13
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

1. 应该是你malloc申请的空间和摄像头采集的数据存放的空间重合了,例子程序中的摄像头采集的数据并没有向内存申请空间,只是把DMA的地址指向了内存的0地址,但是在malloc申请的空间的时候把这块区域当成了没有使用的空间

2。malloc()可以申请外部SDRAM里的空间,申请空间的大小可以自己设定

先在ldf中定义使用外部的SDRAM

上传的图片
  20124262356699.jpg [ 56.61 KB 643×468 ] (缩略时请点击查看原图)

 

然后修改大小

上传的图片
  20124262358899.jpg [ 66.11 KB 643×468 ] (缩略时请点击查看原图)

 

3.,你可以这样试试

1)为采集的数据在内存中申请一个固定的空间 section("sdram0_bank1") unsigned char InputBuffer[480][640*2] ;然后把DMA起始地址指向InputBuffer。

2)在采集数据之前,用malloc申请一个空间,然后把DMA起始地址指向malloc申请的空间的起始地址。

3)把DMA地址偏移480*640*2


我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/4/27 0:03:25
szuyiyu(论坛新手)
szuyiyu
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:244
积分:20
注册时间:2012/4/26
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

我在ppi.c加上section("sdram0_bank1") unsigned char InputBuffer[480][640*2] ,DMA的起始地址也指向了InputBuffer,

void Video_Frame_Capture(void)
{
*pPPI_FRAME = 480;
*pPPI_COUNT = 1279;
*pPPI_DELAY = 0;
*pPPI_CONTROL = 0x01AC;
*pDMA0_START_ADDR = InputBuffer;
*pDMA0_X_COUNT = 640;
*pDMA0_X_MODIFY = 0x2;
*pDMA0_Y_COUNT = 480;
*pDMA0_Y_MODIFY = 0x2;
*pDMA0_PERIPHERAL_MAP = 0x0;
*pDMA0_CONFIG = WNR | WDSIZE_16| DMA2D | RESTART | DI_EN;
*pDMA0_CONFIG |= DMAEN;
ssync();
*pPPI_CONTROL |= PORT_EN;
ssync();
}

最后采集到的图像却成这样,这是怎么了呢?


上传的图片
  201242713534185.bmp [ 900.05 KB 640×480 ] (缩略时请点击查看原图)

 


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/4/27 13:53:57
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

你将  *pDMA0_START_ADDR = InputBuffer;   改为 *pDMA0_START_ADDR = 0x100000;

然后从地址0x100000处刷一张图片,看看是什么样子。

你的其它配置和原驱动一样,我需要获取更多的信息才能判断出错所在。


我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/4/27 23:29:03
szuyiyu(论坛新手)
szuyiyu
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:244
积分:20
注册时间:2012/4/26
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

跟你说的那样去配置了,用malloc来申请地址空间已经可以了,可以对采集的图像进行处理了。不过就不知道为什么用section就有这个问题。 不过也算是解决问题了。  非常感谢啊!


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/4/29 23:16:10
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你看一下工程选项中,LDF部分,那个选择内存大小的选择是否使能,是否和你的实际内存大小一样。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/4/30 8:20:35
szuyiyu(论坛新手)
szuyiyu
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:244
积分:20
注册时间:2012/4/26
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢啊!!

现在做Hough变换,可是每次跑到求sin、cos值的时候就会重新回到程序的开头Set_PLL()或者出现unknow exception. 我在程序开头已包含了<math.h>了,为什么会计算不了呢? 下面是截图。

上传的图片
  20125118421002.jpg [ 20.24 KB 288×180 ] (缩略时请点击查看原图)

 


上传的图片
  20125118422302.jpg [ 12.35 KB 410×84 ] (缩略时请点击查看原图)

 


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/5/1 18:44:01
szuyiyu(论坛新手)
szuyiyu
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:244
积分:20
注册时间:2012/4/26
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
补充一下,当跑进sinValue[i]=sin(i*3.14/180)时我暂停程序,显示illegal  opcode.这是什么意思啊?
上传的图片
  20125118524040.jpg [ 23.27 KB 585×121 ] (缩略时请点击查看原图)

 


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/5/1 18:52:54
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

你将sin返回值传给变量,看是否还报错。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/5/1 19:31:54
szuyiyu(论坛新手)
szuyiyu
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:244
积分:20
注册时间:2012/4/26
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

是这样吗?

double sin_Value;
sin_Value=sin(60*3.14/180);

这样也不行。

不过我放到主函数main里面却可以计算出来,放到我houph()里面却不行。


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/5/1 21:16:11
15
1
1/2
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159314 Call, 1 Queries, Processed in 0.031250 second(s),