从网上得到很多资料,很多地方或多或少的懵逼,但总算有所收获,如今便简单的把收获一点一点总结出来。
帧率 :板球我们很快就搭出来了 但苦于摄像头帧率不高,于是系统必然会有很大的滞后性,即便是调串级PID也着实令人不爽
OV5640窗口
不知为何,前几天搜索,只能搜到这样一个问题,这张图象是什么意思
其实很简单,我们拿大家手上都有的正点案例来讲
//设置窗口的函数有两个,第一个大家都会用就不贴详细了,就是设置输出图像的大小,左右上下偏移量 u8 OV5640_OutSize_Set(u16 offx,u16 offy,u16 width,u16 height){} //第二个相信有文章标题疑惑的一般都不会用,因为如果直接在别人模块上盲改的话,这个函数不会起作用 u8 OV5640_ImageWin_Set(u16 offx,u16 offy,u16 width,u16 height) { u16 xst,yst,xend,yend; xst=offx; yst=offy; xend=offx+width-1; yend=offy+height-1; OV5640_WR_Reg(0X3212,0X03); OV5640_WR_Reg(0X3800,xst>>8); OV5640_WR_Reg(0X3801,xst&0XFF); OV5640_WR_Reg(0X3802,yst>>8); OV5640_WR_Reg(0X3803,yst&0XFF); OV5640_WR_Reg(0X3804,xend>>8); OV5640_WR_Reg(0X3805,xend&0XFF); OV5640_WR_Reg(0X3806,yend>>8); OV5640_WR_Reg(0X3807,yend&0XFF); OV5640_WR_Reg(0X3212,0X13); OV5640_WR_Reg(0X3212,0Xa3); return 0; }
我们仔细看一下这个从未用过的函数,它所操作的寄存器的位置不就是与之前的贴图一一对应。
简单描述一下:
如果0x3800,0x3801,0x3802,0x3803都给0,也就是左边界和上边界都从零开
0x3804,0x3805代表摄像头拍摄的宽,比如分别给0x0a, 0x3f就代表摄像头捕捉宽度为2623
0x3806,0x3807代表摄像头拍摄高:比如0x07, 0x9f就代表捕捉高度为1951
0x3810,0x3811,0x3812,0x3813前后两个分别代表刚才2623,1951想要裁剪的宽长
如此便得到了一整张图像,比较大张,细节,但这显然不是单片机接收到的
后续0x08,0x09,0x0A,0x0B,前后分别代表预设目标图像大小,而这张图像是根据上述摄像头图像缩放而来。
最后单片机得到的图像就是它了,你二值化,连通域等等都是在此基础之上。
最后,这些位操作很多地方都有,要改就把之前相关的都删去,不然最后重复乱操作只能是花屏
帧率
ov5640.c的包含文件中的#include “ov5640cfg.h”
open之后,找到第二个函数 也就是 rgb565模式,也可以改第一个函数jpeg模式的,各取所取
直接改动寄存器0x3035,0x3035 的值
我们打开一个定时器,显示一下帧中断次数
举例:
0x3035=41,0x3036=69;//15帧
0x3035=21,0x3036=ac;//50帧
0x3035=21,0x3036=69;//100帧
各取所需 ,只写一次
最后帧数并非越高越好,改成自己实用的最佳。极度扩大帧率的同时别忘了减下图像面积,优化下算法。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !