战舰上面OV7670中设置图像输出窗口这段该如何理解呢,应该说是算法如何理解,谢谢大家了

2019-08-22 16:20发布

//设置图像输出窗口
//对QVGA设置。
void OV7670_Window_Set(u16 sx,u16 sy,u16 width,u16 height)
{
 u16 endx;
 u16 endy;
 u8 temp;
 endx=sx+width*2; //V*2
  endy=sy+height*2;
 if(endy>784)endy-=784;
 temp=SCCB_RD_Reg(0X03);    //读取Vref之前的值
 temp&=0XF0;
 temp|=((endx&0X03)<<2)|(sx&0X03);
 SCCB_WR_Reg(0X03,temp);    //设置Vref的start和end的最低2位
 SCCB_WR_Reg(0X19,sx>>2);   //设置Vref的start高8位
 SCCB_WR_Reg(0X1A,endx>>2);   //设置Vref的end的高8位  temp=SCCB_RD_Reg(0X32);    //读取Href之前的值
 temp&=0XC0;
 temp|=((endy&0X07)<<3)|(sy&0X07);
 SCCB_WR_Reg(0X17,sy>>3);   //设置Href的start高8位
 SCCB_WR_Reg(0X18,endy>>3);   //设置Href的end的高8位
}  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
30条回答
enots
1楼-- · 2019-08-26 05:08

原子哥,我在这个例程的test.c里 注销了OV7670_Windows_Set()这个函数,刷到mini板后,图像输出仍然正常,感觉它完全可以不要啊,另外,那个10--HSTART  174-VSTART,太费解了,10和174到底是指的啥?和这个摄像头的图像传感器(大小是656x488像素)的大小是什么关系?  另外,如果我自己要去调用这个函数,修改窗口(这个窗口指的是图像传感器上的一个区域吗?),前两个参数从哪儿来呢?

正点原子
2楼-- · 2019-08-26 07:30
回复【26楼】enots:
---------------------------------
那是因为初始化序列里面,有窗口设置的部分,你可以看看我们的初始化寄存器列表,就知道了。
至于参数关系,我也不知道怎么来的,抄别人的,别人貌似是从linux代码移植过来的。
这样,只能你去问OV公司才可以知道为甚了。。。
搞懂了顺便告诉我下,谢谢。
小果粒
3楼-- · 2019-08-22 20:24
总觉得论坛里面有点冷清,这个问题昨晚没想出来,今天问了之后没有人马上回答,又继续想,再不断上网查阅资料,终于想通了,根据查阅所得到的在这里给供大家参考,也谢谢原子哥的团队做了这么好的开发板,省的好多事,呵呵。
1.首先是这段代码的含义,这段代码来自OV7670摄像头的实验例程,含义是为了设置窗口,输入图像的行起始点,场起始点,宽度,高度,可以图片分辨率缩小,以减少数据量来适应数据的传输。
2.下面是主要的寄存器:
0x17HSTART 输出格式-行频开始高八位(低三位在HREF[2:0])
0x18HSTOP 输出格式-行频结束高八位(低三位在HREF[5:3])
0x19VSTRT 输出格式-场频开始高八位(低二位在VREF[1:0])
0x1AVSTOP 输出格式-场频结束高八位(低二位在VREF[3:2])
0x03VREF 位[3:2]VREF结束的低两位(高八位见VSTOP[7:0]
位[1:0]VREF开始的低两位(高八位见VSTOP[7:0]
0x32HREF 读写HREF控制
位[5:3]:HREF结束的低3位(高8位在HSTOP)
位[2:0]:HREF开始的低3位(高8位在HSTOP)
设置方式是这样的:QVGA RGB565 320*240
{0x32,0x80},
{0x17,0x17},
{0x18,0x05},
{0x19,0x02},
{0x1a,0x7b},
{0x03,0x0a},
先把这几个寄存器的值计算一下可以发现设置是这样的:
HSTART=184  HSTOP=40  VSTART=11  VSTOP=492
先看HREF,右图


程序中,height*2 是因为每个像素点是有两个数据
HSTOP=START+HREF,而HSTOP是40,184+320*2=824,而不是824,40 怎么来,是824%784得到的,784如图所示:

HREF:784*tP=640*tP+144*tP
至于endx=sx+width*2;同样上图:如下


可以看出来VSTART VSTOP这两个寄存器决定了采集的行数也就是高度
VSTART=HEIGHT*2+VSTOP;
这样就是该代码的含义吧。也不知道和编写者的想法是不是一致的,请大神指点,纠错。
下面我上的自己改的参数的图片来说明这一点,其他参数的时候会导致屏切割,我还没找到原因……

设置OV7670_Window_Set(10,174,240,320);

设置OV7670_Window_Set(10,174,120,320);

大家可以看到区别的



正点原子
4楼-- · 2019-08-23 01:46
谢谢楼主分享,你说的设置其他值,具体是什么值?情况是什么样的?
小果粒
5楼-- · 2019-08-23 04:46
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-08-23 06:12
这里改了之后,LCD显示部分也需要做修改,比如你设置120*160尺寸,LCD的显示尺寸,也要对应着设置为120*160.

一周热门 更多>