OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10868|回复: 37

求助,F4开发板+OV4076摄像头图像处理

[复制链接]

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
发表于 2016-5-30 20:17:06 | 显示全部楼层 |阅读模式
2金钱
想得到灰度图像,在配置YUV422格式时怎么提取Y分量、关闭UV分量啊?

最佳答案

查看完整内容[请看2#楼]

先得让OV2640输出YUV422格式数据 SCCB_WR_Reg(0xFF, 0x00);//要设置0xDA寄存器,必须让0xFF=0x00 SCCB_WR_Reg(0xDA, 0x00);//设置OV2640输出 YUV422.(YUYV)格式 定义个变量: u16 Gray;//灰度值 Gray =(((yuv422>>(8+3))(8+2))(8+3))(8+3);//即,只取Y值的高5位(丢弃U或V) yuv422>>(8+2);//即,只取Y值的高6位(丢弃U或V) yuv422>>(8+3);//即,只取Y值的高5位(丢弃U或V) 把这三个(高5位、高6位、 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-5-30 20:17:07 | 显示全部楼层
本帖最后由 phoenix 于 2016-6-1 12:28 编辑

先得让OV2640输出YUV422格式数据

SCCB_WR_Reg(0xFF, 0x00);//要设置0xDA寄存器,必须让0xFF=0x00
SCCB_WR_Reg(0xDA, 0x00);//设置OV2640输出  YUV422.(YUYV)格式

定义个变量:

u16 Gray;//灰度值


Gray =(((yuv422>>(8+3))<<11)|((yuv422>>(8+2))<<5)|((yuv422>>(8+3))<<0));

这是把YUV422格式转换为灰度值以RGB565格式显示在LCD上



yuv422 即:YVYU 格式(16位) ,其中,Y为亮度值(8位)。

奇次输出YV(16位) ,偶次输出YU(16位),按此规律循环输出直至最后数据。就是说YVYU 格式数据每次输出(16位)的数据高字节部分为亮度值 Y 。

RGB565格式为(16位),即R为16位中的高5位,即G为16位中的中6位,即B为16位中的低5位。

因此:

yuv422>>(8+3);//即,只取Y值的高5位(丢弃U或V)

yuv422>>(8+2);//即,只取Y值的高6位(丢弃U或V)

yuv422>>(8+3);//即,只取Y值的高5位(丢弃U或V)

把这三个(高5位、高6位、高5位)Y值位或运算,即可得灰度图像值(RGB565格式)

就是这个:

Gray =(((yuv422>>(8+3))<<11)|((yuv422>>(8+2))<<5)|((yuv422>>(8+3))<<0));

不知道 我 有没有 说明白?
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-5-30 21:12:21 | 显示全部楼层
打错了,OV2640摄像头
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-5-31 14:50:26 | 显示全部楼层
phoenix 发表于 2016-5-30 21:55
先得让OV2640输出YUV422格式数据

SCCB_WR_Reg(0xFF, 0x00);//要设置0xDA寄存器,必须让0xFF=0x00

层主讲的很详细,谢谢了
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-1 09:43:14 | 显示全部楼层
phoenix 发表于 2016-5-30 20:17
先得让OV2640输出YUV422格式数据

SCCB_WR_Reg(0xFF, 0x00);//要设置0xDA寄存器,必须让0xFF=0x00

那要是不转化为RGB格式,只提取Y分量用以传给传给上位机,又该怎么弄呢?Y为八位亮度值,也就是256级灰度?谢谢层主了
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-1 12:20:00 | 显示全部楼层
本帖最后由 phoenix 于 2016-6-1 12:32 编辑

先得让OV2640输出YUV422格式数据


void OV2640_YUV422_Mode(void);//设置OV2640输出YUV422.(YUYV)格式(16位数据的高字节为亮度值Y)
{
        u8 temp;
        SCCB_slave_address = 0x60; //设备的地址(0x60用于写/0x61用于读)
        write_SCCB(0xff, 0x00);  //要设置0xDA寄存器,必须让0xFF=0x00

        write_SCCB(0xda, 0x00);//设置OV2640输出YUYV格式

        temp = read_SCCB(0xc2); //读寄存器 0xc2 并赋值给temp
        temp &= 0xef;                //变量temp 位4为0
        write_SCCB(0xc2, temp);//寄存器 0xc2 位4为0
}


定义个变量:

u8 Gray;//灰度值

Gray =(u8)(yuv422>>8);//取YUV422(16位)格式数据的高字节部分

这是把YUV422(16位)格式转换为灰度值(8位)256级灰度
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-1 18:28:52 | 显示全部楼层
本帖最后由 li1207519730 于 2016-6-1 19:05 编辑
phoenix 发表于 2016-6-1 12:20
先得让OV2640输出YUV422格式数据

那YUV422的值又是从哪儿得来的啊
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-1 21:58:32 | 显示全部楼层
li1207519730 发表于 2016-6-1 18:28
那YUV422的值又是从哪儿得来的啊

看过 探索者F4 摄像头实验 就会知道

获取YUV422数据的函数为:

DCMI_DMA_Init(u32 memaddr,u16 memsize,u8 memblen,u8 meminc);//(寄存器版本)

DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_MemoryInc);//(库函数版本)
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-3 11:37:39 | 显示全部楼层
phoenix 发表于 2016-6-1 21:58
看过 探索者F4 摄像头实验 就会知道

获取YUV422数据的函数为:

调用DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_MemoryInc),是把摄像头得到的图像数据由DCMI_DR转存到某个地址吧,我看了,摄像头实验在处理JPEG时把DMA_Memory0BaseAddr取为jpeg_buf,那能不能也找个地址缓存YUV422数据,然后再读取出YUV422的值,而且又该怎么读取这个值呢?问题有点乱,谢谢了
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-3 19:09:05 | 显示全部楼层
li1207519730 发表于 2016-6-3 11:37
调用DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_Memory ...

1、当然能了
2、缓存到你定义的数组里,那就读取数组值就是读取像素值了。

你说有点乱,是整个摄像头数据的流程不清楚还是具体的代码不清楚?
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-8 10:17:09 | 显示全部楼层
phoenix 发表于 2016-6-3 19:09
1、当然能了
2、缓存到你定义的数组里,那就读取数组值就是读取像素值了。

void OV2640_YUV422_Mode(void)
{
        u16 i=0;
        for(i=0;i<(sizeof(ov2640_yuv422_reg_tbl)/2);i++)
        {
                SCCB_WR_Reg(ov2640_yuv422_reg_tbl[0],ov2640_yuv422_reg_tbl[1]);
        }
}

能这样直接配置出YUV422格式么?这种配置方法和层主的那种方法一样么?
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-8 10:53:13 | 显示全部楼层
本帖最后由 phoenix 于 2016-6-8 18:13 编辑
li1207519730 发表于 2016-6-8 10:17
void OV2640_YUV422_Mode(void)
{
        u16 i=0;

能不能你试下就知道了。我没有这么试过,所以无法给你准确答案,不过,看代码是可以的,只不过是压缩的YUV422格式,好像不适合你直接提取亮度值(Y)。

这种配置方法和我的方法,本质上是一样的,都是设置相关寄存器。只不过,这个是官方的。我的是看寄存器数据手册和实验调试出的代码。
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-8 13:01:13 | 显示全部楼层
phoenix 发表于 2016-6-8 10:53
能不能你试下就知道了。我没有这么试过,试用无法给你准确答案,不过,看代码是可以的,只不过是压缩的YU ...

试了试了,再加上void OV2640_JPEG_Mode(void),并且把0xDA赋值为0x00就和层主的方法一样了
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-25 20:06:05 | 显示全部楼层
phoenix 发表于 2016-6-3 19:09
1、当然能了
2、缓存到你定义的数组里,那就读取数组值就是读取像素值了。

F407的SRAM为IS62WV51216,如果想把摄像头采集到的数据存进SRAM,在调用DCMI_DMA_Init时,DMA_Memory0BaseAddr要设置成什么呢?谢谢了
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-25 21:01:15 | 显示全部楼层
本帖最后由 phoenix 于 2016-6-25 21:04 编辑
li1207519730 发表于 2016-6-25 20:06
F407的SRAM为IS62WV51216,如果想把摄像头采集到的数据存进SRAM,在调用DCMI_DMA_Init时,DMA_Memory0Bas ...

当然是设置成你定义在外部SRAM内的数组的地址了。

如:你定义的数组为

u32 testsram[500] __attribute__((at(0X68000000)));//注意:外部SRAM的首地址为0x68000000(探索者开发板)

DCMI_DMA_Init((u32)&testsram,500,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//DCMI DMA配置
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-28 19:01:18 | 显示全部楼层
phoenix 发表于 2016-6-25 21:01
当然是设置成你定义在外部SRAM内的数组的地址了。

如:你定义的数组为

如果不用定义数组的方法,而是对SRAM定义个地址结构体,然后用指针取地址,又该怎么弄呢?就像RGB565液晶屏显示时用&LCD—>LCD_RAM那样。。。我仿照着LCD的地址结构体尝试了几次,调试时显示地址值不存在,也不知道啥原因
捕获.PNG
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-28 19:33:43 | 显示全部楼层
本帖最后由 phoenix 于 2016-6-28 19:46 编辑
li1207519730 发表于 2016-6-28 19:01
如果不用定义数组的方法,而是对SRAM定义个地址结构体,然后用指针取地址,又该怎么弄呢?就像RGB565液晶 ...

主函数中有这句吗?
#include "sram.h"
不知道你为什么要用“地址结构体”方式访问外部SRAM,LCD是为了区分写命令还是写数据。
我个人觉得,简单应用还是用数组的方式访问外部SRAM方便些,复杂应用可以用内存管理。
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-28 19:50:42 | 显示全部楼层
本帖最后由 li1207519730 于 2016-6-28 20:04 编辑
phoenix 发表于 2016-6-28 19:33
主函数中有这句吗?
#include "sram.h"
不知道你为什么要用“地址结构体”方式访问外部SRA ...

sram.h被包含进去了啊,,,我是想要做图像处理,把图像数据直接存进SRAM,每存完一帧就做一次处理,后续可能还要把SRAM分成两块,其中一块处理数据的时侯另一块接收数据,两块轮换着接收和处理数据,感觉这样速度会很快
捕获1.PNG
捕获2.PNG
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-28 20:14:57 | 显示全部楼层
li1207519730 发表于 2016-6-28 19:50
sram.h被包含进去了啊,,,我是想要做图像处理,把图像数据直接存进SRAM,每存完一帧就做一次处理,后续 ...

好像,不行,之前我做了个小实验,把OV2640的数据输出到外部SRAM,失败,外部SRAM的速度跟不上OV2640,远不如内部SRAM。
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-28 20:35:59 | 显示全部楼层
phoenix 发表于 2016-6-28 20:14
好像,不行,之前我做了个小实验,把OV2640的数据输出到外部SRAM,失败,外部SRAM的速度跟不上OV2640,远 ...

大体思路是用一束激光打在一张纸上,用OV2640采集YUV422数据存进SRAM,灰度化,二值化,判断激光斑在图像中的坐标,速度要求每秒钟能处理30~40帧,应该能达到吧
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-6-28 20:57:04 | 显示全部楼层
本帖最后由 phoenix 于 2016-6-28 21:02 编辑
li1207519730 发表于 2016-6-28 20:35
大体思路是用一束激光打在一张纸上,用OV2640采集YUV422数据存进SRAM,灰度化,二值化,判断激光斑在图像 ...

stm32f407+OV2640
那要看图像的分辨率了(SVGA 可达30帧,CIF 可达60帧)
但,内存是问题,CIF(352*288*2=198K)
内部SRAM储存容量不够,外部SRAM储存速度不够
QCIF(176*144*2=49.5K)  这个分辨率内部SRAM到没有问题,但 不知道能不能到达你的要求。
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-6-28 21:27:34 | 显示全部楼层
phoenix 发表于 2016-6-28 20:57
stm32f407+OV2640
那要看图像的分辨率了(SVGA 可达30帧,CIF 可达60帧)
但,内存是问题,CIF(352*28 ...

图像分辨率,速度,目前倒没什么严格要求,就是这个SRAM地址结构体真够难搞的,,,自学STM32一学期了,还是感觉好low
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-1 22:06:26 | 显示全部楼层
phoenix 发表于 2016-6-28 20:57
stm32f407+OV2640
那要看图像的分辨率了(SVGA 可达30帧,CIF 可达60帧)
但,内存是问题,CIF(352*28 ...

CIF好像又有点太小了,我现在用#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))和DCMI_DMA_Init((u32)Bank1_SRAM3_ADDR,1024,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable)将图像数据数据(YUV)写进了外部SRAM,接下来想利用指针读取SRAM里某个(例如第 i 个)像素,如果其亮度大于n,则计算并返回该像素在整个像素矩阵里坐标,又该怎么解决呢,求指教了
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-7-2 15:56:01 | 显示全部楼层
本帖最后由 phoenix 于 2016-7-2 15:59 编辑
li1207519730 发表于 2016-7-1 22:06
CIF好像又有点太小了,我现在用#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))和DCMI_DMA_Init((u32) ...

水平有限,简单写几句,外部SRAM的是16位宽。所以,刚好一个地址储存一个像素值。

这里假设,你让OV2640输出的YUV格式,亮度值Y位于低字节(由你设置YUV格式决定)

u16 w=352,h=288;//图像宽、高

u16 testsram[w*h] __attribute__((at(0X68000000)));//外部SRAM的首地址为0x68000000(探索者开发板)

u32 i;//定义像素序号,取值范围1~352*288
u8  n;//二值化阀值
u16 x,y//像素点坐标

DCMI_DMA_Init((u32)&testsram,w*h,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA配置

if((u8)testsram[i-1]>n)
{
        x=i<w ? i-1 : (i-1)%w ;
        y=(i-1)/w;
}

供你参考,希望有所帮助
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-4 13:20:56 | 显示全部楼层
phoenix 发表于 2016-7-2 15:56
水平有限,简单写几句,外部SRAM的是16位宽。所以,刚好一个地址储存一个像素值。

这里假设,你让OV26 ...

谢谢了
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-5 12:52:32 | 显示全部楼层
phoenix 发表于 2016-7-2 15:56
水平有限,简单写几句,外部SRAM的是16位宽。所以,刚好一个地址储存一个像素值。

这里假设,你让OV26 ...

有个问题,在你举的这个例子里:
u16 w=352,h=288;//图像宽、高

u32 i;//定义像素序号,取值范围1~352*288,

①这个宽352、高288是不是由图像窗口Image_Win_Set设置的?换句话说,在传感器窗口>图像尺寸>图像窗口>图像输出大小时,写入到SRAM的数据长度取决于哪个参数啊?
②摄像头实验里,在初始化OV264时将分辨率置为1600*1200,这个分辨率指的是传感器窗口的大小么?


回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-7-5 15:37:05 | 显示全部楼层
li1207519730 发表于 2016-7-5 12:52
有个问题,在你举的这个例子里:
u16 w=352,h=288;//图像宽、高

1、取决于“图像输出大小”即:OV2640_OutSize_Set 函数

2、在初始化OV2640将分辨率置为1600*1200时,传感器窗口、图像尺寸、图像窗口、图像输出大小,都被设置为1600*1200
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-9 20:02:10 | 显示全部楼层
phoenix 发表于 2016-7-2 15:56
水平有限,简单写几句,外部SRAM的是16位宽。所以,刚好一个地址储存一个像素值。

这里假设,你让OV26 ...

DCMI_DMA_Init((u32)&testsram,w*h,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable),把这里的数据项目数设置成w*h,按理说从SRAM里读到的数据长度为2*w*h个字节才对啊,可调试的时候却是4*w*h,这是怎么回事啊
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-7-11 21:20:57 | 显示全部楼层
li1207519730 发表于 2016-7-9 20:02
DCMI_DMA_Init((u32)&testsram,w*h,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable),把这里的数据项 ...

问:把这里的数据项目数设置成w*h,按理说从SRAM里读到的数据长度为2*w*h个字节才对啊

答:数据长度为2*w*h个字节没有错,但SRAM的位宽为16位,所以为:2*w*h/2=w*h


问:可调试的时候却是4*w*h,这是怎么回事啊

答:4*w*h这个是哪里出现?
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-12 10:35:57 | 显示全部楼层
phoenix 发表于 2016-7-11 21:20
问:把这里的数据项目数设置成w*h,按理说从SRAM里读到的数据长度为2*w*h个字节才对啊

答:数据长度为 ...

我用RGB565格式测试的,开启了传输中断,把DMA的传输数据项设为1,在清除中断标志设断点,每次清除中断时SRAM里只有前四个数在变,其余为定值。把图象输出大小设为160*120,数据传输项设为160*120,用黑色东西紧紧堵住摄像头,使采集到的图像尽可能为黑色,结果SRAM里的一帧图像居然有76800个00和非常接近00的数字
捕1获.PNG
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-7-12 15:46:18 | 显示全部楼层
li1207519730 发表于 2016-7-12 10:35
我用RGB565格式测试的,开启了传输中断,把DMA的传输数据项设为1,在清除中断标志设断点,每次清除中断时 ...

用RGB565格式测试的,开启了传输中断,把DMA的传输数据项设为1,在清除中断标志设断点,每次清除中断时SRAM里只有前四个数在变,其余为定值

这个我估计是不是你“地址自增”没使能的结果。

把图象输出大小设为160*120,数据传输项设为160*120,用黑色东西紧紧堵住摄像头,使采集到的图像尽可能为黑色,结果SRAM里的一帧图像居然有76800个00和非常接近00的数字

数据量多了一倍,应该是那个参数没有设置正确(没看到代码猜测的),00或接近00是对的,数值越大,像素点越亮。
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-15 21:01:37 | 显示全部楼层
phoenix 发表于 2016-7-12 15:46
用RGB565格式测试的,开启了传输中断,把DMA的传输数据项设为1,在清除中断标志设断点,每次清除中断时SR ...

开启地址自增还是那种情况,就是在例程的基础上改动了一下
捕1获.PNG
捕获1.PNG
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-15 21:17:31 | 显示全部楼层
phoenix 发表于 2016-7-5 15:37
1、取决于“图像输出大小”即:OV2640_OutSize_Set 函数

2、在初始化OV2640将分辨率置为1600*1200时, ...

要在初始化OV2640时将摄像头分辨率设置为480*800该怎么弄呢,是把初始化函数里采用SXGA分辨率的那个for语句直接改为设置传感器窗口、图像尺寸、图像窗口、图像输出大小的那几个函数么
回复

使用道具 举报

0

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2015-8-25
在线时间
165 小时
发表于 2016-7-15 21:59:25 | 显示全部楼层
li1207519730 发表于 2016-7-15 21:17
要在初始化OV2640时将摄像头分辨率设置为480*800该怎么弄呢,是把初始化函数里采用SXGA分辨率的那个for语 ...

要在初始化OV2640时将摄像头分辨率设置为480*800当然可以,但你必须知道改哪个具体的寄存器数值,麻烦,最方便的做法是:


1、可以正常初始化OV2640

OV2640_Init();//初始化OV2640,默认输出1600*1200尺寸


2、接着按照需要改变尺寸,需要改哪个用那个(但必须遵守“尺寸规则”)

如:

//OV2640_Window_Set(0,0,1600,1200);//设置传感器窗口

//OV2640_ImageSize_Set(1600,1200);//设置图像尺寸

//OV2640_ImageWin_Set(0,0,1600,1200);//图像开窗大小

OV2640_OutSize_Set(480,800);//图像输出大小
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2016-7-15 22:22:57 | 显示全部楼层
有中文版ov2640数据手册吗?
回复

使用道具 举报

11

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-15
在线时间
66 小时
 楼主| 发表于 2016-7-16 11:22:06 | 显示全部楼层
lvehe 发表于 2016-7-15 22:22
有中文版ov2640数据手册吗?

中文的木有啊,都是琢磨英文版的
回复

使用道具 举报

35

主题

309

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2641
金钱
2641
注册时间
2016-8-10
在线时间
470 小时
发表于 2017-6-23 11:47:20 | 显示全部楼层
phoenix 发表于 2016-7-15 21:59
要在初始化OV2640时将摄像头分辨率设置为480*800当然可以,但你必须知道改哪个具体的寄存器数值,麻烦, ...

我初始化摄像头哪里设置的是800*600的

OV2640_Window_Set(0,0,800,600);

OV2640_ImageSize_Set(800,600);

OV2640_ImageWin_Set(0,0,800,600);

OV2640_OutSize_Set(300,300);
这样设置的但是图像显示不完整,还跳动,请问是什么导致的,我是DCMI直接dma到LCD上
回复

使用道具 举报

35

主题

309

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2641
金钱
2641
注册时间
2016-8-10
在线时间
470 小时
发表于 2017-6-23 11:47:31 | 显示全部楼层
phoenix 发表于 2016-7-15 21:59
要在初始化OV2640时将摄像头分辨率设置为480*800当然可以,但你必须知道改哪个具体的寄存器数值,麻烦, ...

我初始化摄像头哪里设置的是800*600的

OV2640_Window_Set(0,0,800,600);

OV2640_ImageSize_Set(800,600);

OV2640_ImageWin_Set(0,0,800,600);

OV2640_OutSize_Set(300,300);
这样设置的但是图像显示不完整,还跳动,请问是什么导致的,我是DCMI直接dma到LCD上
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 10:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表