怠惰了许久,迫于电赛降至 不得不顺手刷了下风力摆,板球控制系统
从网上得到很多资料,很多地方或多或少的懵逼,但总算有所收获,如今便简单的把收获一点一点总结出来
帧率 : 板球我们很快就搭出来了 但苦于摄像头帧率不高,于是系统必然会有很大的滞后性,即便是调串级PID也着实令人不爽
不知为何,前几天搜索,只能搜到这样一个问题,这张图象是什么意思
其实很简单,我们拿大家手上都有的正点案例来讲
//设置窗口的函数有两个,第一个大家都会用就不贴详细了,就是设置输出图像的大小,左右上下偏移量
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帧
各取所需 ,只写一次
最后帧数并非越高越好,改成自己实用的最佳。极度扩大帧率的同时别忘了减下图像面积,优化下算法。