1、camera如何调试?
Camera的接口如下:
1.VSYNC
2.HSYNC
3.PWDN
4.RESET
5.AGND
6.SCL
7.SDA
8.DVDD18
9.DOVDD28
10.MCLK
11.PCLK
12.DGND
13.DATA0-DATA7
14.IOVDD28
15.GND
看sensor的spec来调试。
1)莫尔条纹(彩带)
从技术角度上讲,莫尔条纹是两条线或两个物体之间以恒定的角度和频率发生干涉的视觉结果,当人眼无法分辨这两条线 或两个物体时,只能看到干涉的花纹,这种光学现象就是莫尔条纹。莫尔条纹现象是由于信号取样频率接近感光器分辨率所致,通常解决方法用一个低通滤镜把高于 感光器分辨率的信号挡住,其副作用就是降低成像分辨率。因此在设计低通滤镜时设计师要在分辨率和莫尔条纹之间做一个妥协选择。因为D70的CCD前面使用 效果比较弱的低通滤镜,所以在提高成像分辨率也造成了莫尔条纹出现几率的增大,此现象也广泛出现于其他DSLR上。 推荐解决方法:避免拍摄场面有接近相机分辨率的规则性图案,或者后期通过软件去除。
"水波纹"的现象、banding或者是fliker,如下图所示:
关于你反映的手机对着日光灯preview时有类似"水波纹"的现象, 现解释如下: 这个现象叫做banding或者是fliker,主要是由于日光灯的频率 和曝光时间而引起的。我们已经避免了在室内正常情况下(不对着日光灯的情况) 没有banding的现象。但是对着日光灯时,banding现象是无法完全消除的。 这种现象属于正常的。
2)对比度过大导致颜色更艳,有偏红。
3)中间亮,四周暗:shutting不够。
4)暗处噪声大:调gamma。
5)镜头能够影响分辨率和清晰度。
6)preview 和capture 时存在的坏点是由于sensor自己产生的。一般主要是亮的坏点。
OV2640在Fxxxx上通过取2.0M(1600*1200)sensor处理后输出给sunplus556(800*600)来减小坏点。
7)高低亮度动态范围太小。导致高亮时过曝,低亮图片亮度不够。(ov9655)
解决方法:(会使图片变的模糊.模糊的原因是因为使用的镜头的mtf数值太小,模组整体高度太低造成的.要彻底解决这个问题,只有更换更好的镜头才行.)
修改gamma:
60 7A2c
60 7B C
60 7C 19
60 7D 28
60 7E 40
60 7F 4b
60 80 56
60 81 60
60 82 67
60 83 70
60 84 7a
60 85 89
60 86 95
60 87 AF
60 88 C8
60 89 DF
8)预览低亮度拍照目标效果不佳,需要改善。(ov9655)
解决方法:增加gain:
60 142e
9)预览低亮度拍照目标会出现闪烁,请调整。(ov9655)
解决方法:(亮度的调整需要时间,所以亮度会闪几下)
固定fps:
60 3b0c
10) preview和capture的不一致:(ov9655)
我们preview使用的是vga的模式,capture使用的是sxga的模式.两个模式切换过程中要进行亮度计算,这个计算是将sensor的增益转化成曝光时间.由于这两种实现亮度的方式有差别,所以preview和capture一定存在差异.我们的调试就是让这种差异尽量的小.
11)preview中有跳动的感觉.(ov9655)
从亮到暗和从暗到亮的变化中,sensor的调整需要时间.在这个时间中,vsync一直有输出,所以可以看到这个问题.(主要是坏帧的问题)
现在的修改是调整过程中的vsync不输出,所以看不到这个问题了.
12)在暗处切换夜景和自动后,回到正常光线preview不停的闪动。(ov9655)
For 9655 night mode:
night:
0x3b,0xcc
normal:
0x3b,0x0c
0x2d,0x00
0x2e,0x00
在夜间模式的时候是会自动变桢率的,sensor会自动调整0x2d,0x2e的数值来变桢率.切回自动的时候要将这两个寄存器清零,不然它们还是夜间模式里面的数值.
13)Fxxxx的颜色不够鲜艳目前最新的版本发灰。
这个应该是图象的数据分布有问题,范围窄(我看下来32以下的数据很少),而cxxxxx的数据分布比较宽。
另外,我们和LCDC(sunplus)调整颜色是对者标准色板来调试的。其实Cxxxx的颜色反而是有些失真的。
建议:
必须需要isp做black levelcaliberation,让响应曲线过零点。
如果没有,看看有没有Y_offset,Y_contrast可以动动的。
14)亮度不够。
从分析来看,平均亮度在128+/-10范围之内了,曝光控制是正常的。可能是因为图象发灰导致看上去亮度不够
建议:解决第一条可能这条也解决了。
15)暗光下噪点大。
暗光对sensor的要求高。任何sensor的噪声都要变大。
对于30万象素的手机,主要还是看屏上的效果,虽然噪声大了点,但屏小 ,所以不明显。
重点应该在提升其他方面,使preview的效果更好。
16)夜景下比Cxxxxxx噪点大。微带发绿。
大部分sensor都会在暗处发绿和亮处发红,但应该在一个可接受的范围之内。
原因:红绿蓝三个颜色的响应曲线是非线形的,在做白平衡时候靠简单的线形处理无法将三根曲线进行重合。手机DSP能力毕竟不能够和数码相机的能力相比。
如果把暗光颜色很准,那么可能正常下颜色就不够鲜艳或者亮处颜色不准,或者噪声大等其他更加严重的状况出现。
我觉得现在的状况还不算离谱。
17)数字影像测试总评
· 白平衡检测(White Balance)
白平衡差异(White Balance)影响数字相机的色彩表现甚鉅,虽然大多数的数字相机自动白平衡(AUTOWB)都能应付一般的拍摄状况。不过, 若将白平衡误差 更进一步以(K)色温来区分,则误差普遍存在于各厂家的设定之中。ColorChecker 特别针对白平衡部分设计了图块检测,标示 (1) 为原始摄影图块、标示(2)则为理想的 ColorChecker HSV值合併运算曝光之表现以及标示 (3) 原始 ColorChecker 理想值,以 HSV 和 K 两种系统显示白平衡的误差比值。
·
镜头光衰减(Light FallOff)
采用多重镜片组合设计的镜头,镜片材质、形状,或多或少都会影响光线路径和光量大小;不同于色像差,Light Falloff 主要是判别自镜头中央 起至整幅画面边缘位置于拍摄均匀光线下所产生的光差。理想镜头于均匀光线下,自中心到边缘的光分布应为相同,但实际上却不容易做到,形成许多摄影人员口中的『暗角』现象。
光衰减检测,可以看出镜头中心到边缘影像光线不均匀分佈的情形
优良的镜头设计下,人眼几乎难以辨认 Falloff 的发生。但在电脑或专业仪器的辅助下,镜头的光衰减却相当明显。理想的光衰减检测,可透过 Labsphere 或 Electro-Optical Industries(EOI) 产生球状均匀光线(模拟自然状态下三维空间之均匀光线产生),例如:Labsphere 出品的 USS-1200 或 USS-1200V;实际上,一般的检测也可以透过大面的素色板(或墙壁),藉着散焦方式取得均匀光线进入相机之中,再利用相关的电脑软件取得对应的数据。
·
影像器材数据化量测综合评量
今日的影像器材效能检测已经是一门相当科学且专业化的科目,一般摄影玩家较难负担如此复杂且昂贵的测试器材,而必须仰赖媒体或公正第三者提供相关测试报告。为了方便大家快速且有效的认知器材性能,多数评量都集中『解像力』和『色彩』表现上。然而,实际上,影响影像品质的因素不单只是镜头和 CCD 而已,甚至包括许多外在的人为因素。
附註:人为因素的影响在测试报告中很难被发现,多数的专业媒体理当避免人为影响其最终测试结果。
影响数字相机 测试表现的因素,也往往是许多业余摄影者常犯的错误。例如:
1. 相机是否固定于稳定的三角架(反光镜是否锁起);相机机身是否会晃动影像画质
2. 相机与测试标的距离是否恰当
3. 相机是否正确与测试标的完成对焦; 对焦选择是否正确、对焦点是否位于正确中心
4. 影像格式和压缩比是否正确选择(RAW格式是否可以选择) ; 过高的压缩比或过低的解析度,同样影响画质的表现
5. 环境 Gamma 值的选择 ; 环境亮度影响画质清晰表现甚鉅
6. 清洁工作是否确实 ; 无论镜头表现、UV滤镜、保护镜,甚至于相机内之CCD / CMOS 等,沾染上灰尘等,都将影响后续的测试值
7. 镜头的设定 ; 测试标的是否位于有效的景深内(镜头之光圈和焦长是否正确设定); 测试 DSLR 最好可以选择定焦镜头
8. 光线的位置 ; 直射光线易造成测试标的的反光,影响判别。
·
亲身体验
因此,数据化的测试报告,虽有助于你瞭解相机的性能表现,却不一定让你在操作上得心应手。一架具备完善操作设计的消费型数位相机,未必一定输给 DSLR。『尽信书,不如无书!』,实际走访体验你心目中的影像器材,辅之你网路或是平面上阅读到的测试报告,将更具说服力。
18)我多次拍摄白纸的照片.一般在刚进入preview时,马上拍摄会出现严重偏红或者偏蓝等.
OV:因为自动曝光和自动白平衡在preview开始前会有一个初始值得设置,在进入preview后,曝光和白平衡自动调节开始,调节过程的长短与初始设置和实际环境间的差异相关。
改变初始值可以使在某一特定环境下的调节时间最短,但对其他条件,还是要视环境差异的大小而定。
通过提高preview的桢率可以缩短调节的时间,或者可以使用跳桢的方法使此现象减轻。
LCDC(Sunplus):这个以前我们调过,但是AWB初始化速度太慢,没有效果。 但是你可以通过流程来控制,让开始的几帧不要显示在屏幕上,即让那个等待界面时间长一些,将preview的前几帧不要显示。
19)ov7670在对着窗外一会(亮处),再转换到室内(暗处)这时候调节亮度特别慢或者preview全黑不能恢复。这个问题是因为LCDC(sunplus)在进入preview时没有完全给ov7670初始化,而是只在手机开机初始化一次,以后只是更改少部分寄存器。后来更改为进入preview时就初始化一次寄存器就可以了。
2、stack栈和heap堆的关系?
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数 据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总 之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序