搜索
bottom↓
回复: 28

OV7670 出图像模糊,8色条测试结果颜色失真。求高人指点!

[复制链接]

出0入0汤圆

发表于 2011-3-23 22:06:24 | 显示全部楼层 |阅读模式
如题我用的是OV7670摄像头,主芯片用的是FPGA,通过以太网UDP协议上传到PC机上,然后由VC编的程序显示。(我这样做的目的是便于远程监控)
可以确定的是通过UDP上传到PC机这部分是没有错的,这些都是通过FPGA来完成。然后我按照wangguanfu大哥的C程序编写的FPGA程序,通过示波器可以看到SCCB这块的初始化时序是没问题的,就是不知道我配置的寄存器有没有问题。整个图像采集部分与在论坛上看到的其他大侠们的方案类似,也是数据进来后进入FPGA内部的FIFO,然后UDP打包,然后以太网传输。
调了有一阵子了,前一阵子一直是初始化不成功,现在成功了但是图像确显示的不正常。能看到模糊的轮廓,如白炽灯的样子,脑袋的样子,但是图像都是模糊的。而且我的8色条测试(既{ox71, ox80})结果出来最左边的白色条以及最右边的黑色条是对的,其余的都是不对的,我怀疑可能是我的vc程序图像显示的有问题。但是模糊的轮廓还是说不清楚,还望大侠们不吝赐教指点下小弟哈~
稍后贴上截下来的图片和寄存器表

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-3-23 22:10:38 | 显示全部楼层
回复【楼主位】alanghc  
-----------------------------------------------------------------------

第一次发帖子,还要审核的,自己先站个沙发这就上图。

(原文件名:Video.JPG)
上图为8色条测试结果 既{ox71, ox80}

出0入0汤圆

 楼主| 发表于 2011-3-23 22:12:09 | 显示全部楼层
回复【楼主位】alanghc  
-----------------------------------------------------------------------

下图为照我脑袋的两张采集图像,背景有两盏白炽灯。
另,我用的ov7670摄像头 是在论坛中wang guanfu大哥哪里买的,我在测试中发现把摄像头上面的那个镜头转下来后图片就看不清楚了,可能是曝光不同导致的吧? 希望各位遇到过此类问题的大哥们 帮帮忙哈~ 小弟在这里先谢下了


(原文件名:Video4.JPG)


(原文件名:Video5.JPG)

出0入0汤圆

 楼主| 发表于 2011-3-23 22:13:39 | 显示全部楼层
回复【楼主位】alanghc  
-----------------------------------------------------------------------

下图为我把自己脑袋移开后照相所得,能看到两盏白炽灯的样子(左上角和中部下方)



(原文件名:Video7.JPG)

出0入0汤圆

 楼主| 发表于 2011-3-23 22:23:19 | 显示全部楼层
回复【楼主位】alanghc  
-----------------------------------------------------------------------

我设置的图像大小是QVGA 320*240 ,RGB565,给的Xclk是10MHZ,内部PLL倍频*4(我试过旁路PLL后数据不正常)。测试中发现一个href时钟下有640个pclk,这个是正常的一个像素点两个字节;但是一个VSYNG_clk周期下(上一个VSYNG_clk低电平到下一个VSYNG_clk低电平为止)本应该有240个Href_clk的,我实际收到的确有255个href,这让我很困惑,有没有可能是VSYNG_clk高电平的时候也传输上来了Href_clk呢? 还有有哪些因素回导致我的图像成这个样子呢?还望大侠们不吝赐教啊!

小弟寄存器表如下:
assign   nmb[0] = {8'h3a, 8'h04}; //YUYV
assign   nmb[1] = {8'h40, 8'hd0}; //output rang 00~ff  ; rgb565 output
assign   nmb[2] = {8'h12, 8'h14}; //QVGA ;RGB  {8'h12, 8'h14}
assign   nmb[3] = {8'h32, 8'h80}; //HREF
assign   nmb[4] = {8'h17, 8'h16}; //
assign   nmb[5] = {8'h18, 8'h04}; //
assign   nmb[6] = {8'h19, 8'h02}; //
assign   nmb[7] = {8'h1a, 8'h7b};//8'h7a;
assign   nmb[8] = {8'h03, 8'h06};//8'h0a;
assign   nmb[9] = {8'h0c, 8'h00};//
assign   nmb[10] = {8'h3e, 8'h00};//pclk
//---------------------------------------debug--------------------------------------
assign   nmb[11] = {8'h70, 8'h00};//
assign   nmb[12] = {8'h71, 8'h00};//
//---------------------------------------debug--------------------------------------
assign   nmb[13] = {8'h72, 8'h11};//
assign   nmb[14] = {8'h73, 8'h00};//
assign   nmb[15] = {8'ha2, 8'h02};//
//---------------------------------------debug--------------------------------------
assign   nmb[16] = {8'h11, 8'h40};//   {0x11, 0x02},input clk/3  ; {8'h11, 8'h40} use external clk
//---------------------------------------debug--------------------------------------
assign   nmb[17] = {8'h7a, 8'h20};//default 8'h24
assign   nmb[18] = {8'h7b, 8'h1c};//default 8'h04
assign   nmb[19] = {8'h7c, 8'h28};//default 8'h07
assign   nmb[20] = {8'h7d, 8'h3c};//default 8'h10
assign   nmb[21] = {8'h7e, 8'h55};//default 8'h28
assign   nmb[22] = {8'h7f, 8'h68};//default 8'h36
assign   nmb[23] = {8'h80, 8'h76};//default 8'h44
assign   nmb[24] = {8'h81, 8'h80};//default 8'hf2
assign   nmb[25] = {8'h82, 8'h88};//default 8'h60
assign   nmb[26] = {8'h83, 8'h8f};//default 8'h6c
assign   nmb[27] = {8'h84, 8'h96};//default 8'h78
assign   nmb[28] = {8'h85, 8'ha3};//default 8'h8c
assign   nmb[29] = {8'h86, 8'haf};//default 8'h9e
assign   nmb[30] = {8'h87, 8'hc4};//default 8'hbb
assign   nmb[31] = {8'h88, 8'hd7};//default 8'hd2
assign   nmb[32] = {8'h89, 8'he8};//default 8'he5
assign   nmb[33] = {8'h13, 8'he0};//
assign   nmb[34] = {8'h00, 8'h00};//
assign   nmb[35] = {8'h10, 8'h00};//
assign   nmb[36] = {8'h0d, 8'h00};//
assign   nmb[37] = {8'h14, 8'h20};//
assign   nmb[38] = {8'ha5, 8'h05};
assign   nmb[39] = {8'hab, 8'h07};
assign   nmb[40] = {8'h24, 8'h75};
assign   nmb[41] = {8'h25, 8'h63};
assign   nmb[42] = {8'h26, 8'hA5};
assign   nmb[43] = {8'h9f, 8'h78};
assign   nmb[44] = {8'ha0, 8'h68};
assign   nmb[45] = {8'ha1, 8'h03};//8'h0b;
assign   nmb[46] = {8'ha6, 8'hdf};//8'hd8;
assign   nmb[47] = {8'ha7, 8'hdf};//8'hd8;
assign   nmb[48] = {8'ha8, 8'hf0};
assign   nmb[49] = {8'ha9, 8'h90};
assign   nmb[50] = {8'haa, 8'h94};
assign   nmb[51] = {8'h13, 8'he5};
assign   nmb[52] = {8'h0e, 8'h61};
assign   nmb[53] = {8'h0f, 8'h4b};
assign   nmb[54] = {8'h16, 8'h02};
assign   nmb[55] = {8'h1e, 8'h37};//8'h07;
assign   nmb[56] = {8'h21, 8'h02};
assign   nmb[57] = {8'h22, 8'h91};
assign   nmb[58] = {8'h29, 8'h07};
assign   nmb[59] = {8'h33, 8'h0b};
assign   nmb[60] = {8'h35, 8'h0b};
assign   nmb[61] = {8'h37, 8'h1d};
assign   nmb[62] = {8'h38, 8'h71};
assign   nmb[63] = {8'h39, 8'h2a};//
//---------------------------------------debug--------------------------------------
assign   nmb[64] = {8'h3c, 8'h80};//  {8'h3c, 8'h80};  0:No HREF when VSYNC is low
//---------------------------------------debug--------------------------------------
assign   nmb[65] = {8'h4d, 8'h40};
assign   nmb[66] = {8'h4e, 8'h20};
assign   nmb[67] = {8'h69, 8'h0c};///////////////////////
//---------------------------------------debug--------------------------------------
assign   nmb[68] = {8'h6b, 8'h60};//PLL          {0x6b, 0x80},//BYPASS  PLL; {8'h6b, 8'h60};input clk*4
//---------------------------------------debug--------------------------------------
assign   nmb[69] = {8'h74, 8'h19};
assign   nmb[70] = {8'h8d, 8'h4f};
assign   nmb[71] = {8'h8e, 8'h00};
assign   nmb[72] = {8'h8f, 8'h00};
assign   nmb[73] = {8'h90, 8'h00};
assign   nmb[74] = {8'h91, 8'h00};
assign   nmb[75] = {8'h92, 8'h00};//8'h19;//8'h66
assign   nmb[76] = {8'h96, 8'h00};
assign   nmb[77] = {8'h9a, 8'h80};
assign   nmb[78] = {8'hb0, 8'h84};
assign   nmb[79] = {8'hb1, 8'h0c};
assign   nmb[80] = {8'hb2, 8'h0e};
assign   nmb[81] = {8'hb3, 8'h82};
assign   nmb[81] = {8'hb3, 8'h82};
assign   nmb[82] = {8'hb8, 8'h0a};
assign   nmb[83] = {8'h43, 8'h14};
assign   nmb[84] = {8'h44, 8'hf0};
assign   nmb[85] = {8'h45, 8'h34};
assign   nmb[86] = {8'h46, 8'h58};
assign   nmb[87] = {8'h47, 8'h28};
assign   nmb[88] = {8'h48, 8'h3a};
assign   nmb[89] = {8'h59, 8'h88};
assign   nmb[90] = {8'h5a, 8'h88};
assign   nmb[91] = {8'h5b, 8'h44};
assign   nmb[92] = {8'h5c, 8'h67};
assign   nmb[93] = {8'h5d, 8'h49};
assign   nmb[94] = {8'h5e, 8'h0e};
assign   nmb[95] = {8'h64, 8'h04};
assign   nmb[96] = {8'h65, 8'h20};
assign   nmb[97] = {8'h66, 8'h05};
assign   nmb[98] = {8'h94, 8'h04};
assign   nmb[99] = {8'h95, 8'h08};
assign   nmb[100] = {8'h6c, 8'h0a};
assign   nmb[101] = {8'h6d, 8'h55};
assign   nmb[102] = {8'h6e, 8'h11};
assign   nmb[103] = {8'h6f, 8'h9f};//8'h9e for advance AWB
//---------------------------------------debug--------------------------------------
assign   nmb[104] = {8'h6a, 8'h40};//        {0x6a, 0x00}, G channel AWB gain  ;{8'h6a, 8'h40};
//---------------------------------------debug--------------------------------------
assign   nmb[105] = {8'h01, 8'h40};        //        {0x01, 0x80}, Blue channel gain   ;{0x01, 0x40},
//---------------------------------------debug--------------------------------------
assign   nmb[106] = {8'h02, 8'h40}; //        {0x02, 0x80}, Red channel gain    ;{0x02, 0x40},
//---------------------------------------debug--------------------------------------
assign   nmb[107] = {8'h13, 8'he7};
assign   nmb[108] = {8'h15, 8'h00};
assign   nmb[109] = {8'h4f, 8'h80};
assign   nmb[110] = {8'h50, 8'h80};
assign   nmb[111] = {8'h51, 8'h00};
assign   nmb[112] = {8'h52, 8'h22};
assign   nmb[113] = {8'h53, 8'h5e};
assign   nmb[114] = {8'h54, 8'h80};
assign   nmb[115] = {8'h58, 8'h9e};   
assign   nmb[116] = {8'h41, 8'h08};
assign   nmb[117] = {8'h3f, 8'h00};
assign   nmb[118] = {8'h75, 8'h05};
assign   nmb[119] = {8'h76, 8'he1};
assign   nmb[120] = {8'h4c, 8'h00};
assign   nmb[121] = {8'h77, 8'h01};
assign   nmb[122] = {8'h3d, 8'hc2};   //YUYV;
assign   nmb[123] = {8'h4b, 8'h09};
assign   nmb[124] = {8'hc9, 8'h60};
assign   nmb[125] = {8'h41, 8'h38};
assign   nmb[126] = {8'h56, 8'h40};//8'h40;  change according to Jim's request
assign   nmb[127] = {8'h34, 8'h11};
assign   nmb[128] = {8'h3b, 8'h02};//8'h00;//8'h02;
assign   nmb[129] = {8'ha4, 8'h89};//8'h88;
assign   nmb[130] = {8'h96, 8'h00};
assign   nmb[131] = {8'h97, 8'h30};
assign   nmb[132] = {8'h98, 8'h20};
assign   nmb[133] = {8'h99, 8'h30};
assign   nmb[134] = {8'h9a, 8'h84};
assign   nmb[135] = {8'h9b, 8'h29};
assign   nmb[136] = {8'h9c, 8'h03};
assign   nmb[137] = {8'h9d, 8'h4c};
assign   nmb[138] = {8'h9e, 8'h3f};
assign   nmb[139] = {8'h78, 8'h04};   
assign   nmb[140] = {8'h79, 8'h01};
//---------------------------------------debug--------------------------------------
assign   nmb[141] = {8'hc8, 8'hf0}; //                {0xc8, 0x7e},
assign   nmb[142] = {8'h79, 8'h0f};//                {0x79, 0x0a},
assign   nmb[143] = {8'hc8, 8'h00};//                {0xc8, 0x80},
assign   nmb[144] = {8'h79, 8'h10};//                {0x79, 0x0b},
assign   nmb[145] = {8'hc8, 8'h7e};//                {0xc8, 0x01},
assign   nmb[146] = {8'h79, 8'h0a};//                {0x79, 0x0c},
assign   nmb[147] = {8'hc8, 8'h80};//                {0xc8, 0x0f},
assign   nmb[148] = {8'h79, 8'h0b};//                {0x79, 0x0d},
assign   nmb[149] = {8'hc8, 8'h01};//                {0xc8, 0x20},
assign   nmb[150] = {8'h79, 8'h0c};//                {0x79, 0x09},
assign   nmb[151] = {8'hc8, 8'h0f};//                {0xc8, 0x80},
assign   nmb[152] = {8'h79, 8'h0d};//                {0x79, 0x02},
assign   nmb[153] = {8'hc8, 8'h20};//                {0xc8, 0xc0},
assign   nmb[154] = {8'h79, 8'h09};//                {0x79, 0x03},
assign   nmb[155] = {8'hc8, 8'h80};//                {0xc8, 0x40},
assign   nmb[156] = {8'h79, 8'h02};//                {0x79, 0x05},
assign   nmb[157] = {8'hc8, 8'hc0};//                {0xc8, 0x30},
assign   nmb[158] = {8'h79, 8'h03};//                {0x79, 0x26},
assign   nmb[159] = {8'hc8, 8'h40};//                no one
assign   nmb[160] = {8'h79, 8'h05};//                no one
assign   nmb[161] = {8'hc8, 8'h30};//                no one
assign   nmb[162] = {8'h79, 8'h26};//                no one
//---------------------------------------debug--------------------------------------
assign   nmb[163] = {8'h09, 8'h03};
assign   nmb[164] = {8'h55, 8'h00};
assign   nmb[165] = {8'h56, 8'h40};   
assign   nmb[166] = {8'h3b, 8'h42};//8'h82;//8'hc0;//8'hc2;  //night mode


小弟QQ:150524225
E-mail:alanghc@sina.com

出0入0汤圆

 楼主| 发表于 2011-3-24 10:48:57 | 显示全部楼层
小弟在线等前辈们支招啊~

出0入0汤圆

发表于 2011-3-24 16:22:21 | 显示全部楼层
回复【楼主位】alanghc  
-----------------------------------------------------------------------

me too。。。我的摄头出来的图像和你一样啊 彩条颜色不正常 拍动态图模糊但能看到轮廓 增大曝光时间后整个图像发绿 光线明处能看清物体 但是光线暗处完全是绿的一塌糊涂。。。

出0入0汤圆

 楼主| 发表于 2011-3-24 21:36:36 | 显示全部楼层
回复【6楼】wf_blackie  
-----------------------------------------------------------------------
我后来发现论坛里有个帖子跟我遇到的问题有些类似,原帖如下:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4596613&bbs_page_no=1&bbs_id=3028

在这个帖子中 haha04358 大哥说有可能是“色彩空间编码有问题”,“采集的时候,多采了一个像元,或少采了一个像元,造成色彩编码错位” 然后我根据他的提议在上位机恢复的时候做了一个尝试。
就是考虑OV7670采集的RGB565数据上来的2字节数据 有可能错位。如下图:

(原文件名:t3.JPG)

有可能是第一个first Byte读错了,于是通过更改上位机程序,第一个像素点向后多读一个Byte这样得到的图像有两种,如下图所示:

(原文件名:t2.JPG)
上图为第一种情况:不改变第一个字节情况下的采集图片。


(原文件名:t1.JPG)
上图为第二种情况:更改第一个字节所得的采集图片,明显比第一种情况图像要清晰些,同时整体颜色偏蓝

我的几个有关增益的寄存器值如下:
assign   nmb[104] = {8'h6a, 8'h40};
assign   nmb[105] = {8'h01, 8'h40};
assign   nmb[106] = {8'h02, 8'h40};

出0入0汤圆

 楼主| 发表于 2011-3-24 21:43:22 | 显示全部楼层
回复【楼主位】alanghc  
-----------------------------------------------------------------------

再上一组两种情况的采集图片,我是通过手动调节Ov7670镜头的方式来确定最优的情况,现在最优的情况就是勉强能看清楚我的脸,同时照了一张A4纸上面的字迹依稀可见。下图为两种情况的对比(第一个像素点正常读取两字节;第一个像素点向后多读一个字节)

(原文件名:t6.JPG)


(原文件名:t5.JPG)

再上传一张照的A4纸依稀可见的图片,但是整体颜色偏蓝,我不清楚是不是01这个寄存器配置有问题

出0入0汤圆

发表于 2011-3-24 21:58:20 | 显示全部楼层
我做数码相机和摄像机硬件的,对软件方面不大熟悉,这种情况在我们硬件看来是D0-D7位中有数据线断开造成的(软件OK的情况下)。

出0入0汤圆

发表于 2011-3-24 22:00:09 | 显示全部楼层
另外我们用的DSP+OV7670,给Sensor的MCLK时钟是24Mhz

出0入0汤圆

 楼主| 发表于 2011-3-24 22:13:58 | 显示全部楼层
回复【9楼】lixc2008  
-----------------------------------------------------------------------

可算等到大侠的回复了哈! lixc2008 你说的是D0-D7中某一位数据线断掉了是么?如果有一位掉的话,那8位测试图像中白色条和黑色条却是对的哦,这怎么解释呢?
我分析了一种情况有可能是我Ov7670采集的是RGB 565的顺序,而上位机软件是BGR565的顺序,有可能会导致其他的颜色不对只有黑白是对的。您看呢?VC下的软件我正在想办法改,看能不能排除,但是我还是感觉图像的清晰度不高、噪声大。24MHZ的时钟我也试过,不过我的FIFO不够大,UDP这边传输的效率现在没有提上来,所以24MHZ暂时发不上完整的包。后面我要在这个地方改进的。
感谢 lixc2008  朋友的回复,大家一起讨论下可能对我最有帮助了

出0入0汤圆

发表于 2011-3-24 22:39:12 | 显示全部楼层
RGB565? 高低字节反或者单字节高低BIT反

出0入0汤圆

发表于 2011-3-24 23:13:57 | 显示全部楼层

(原文件名:A.jpg)

出0入0汤圆

发表于 2011-5-26 17:43:45 | 显示全部楼层
半夜看这东西拍的图,别吓着人了。。。。呵呵
最近我正准备做一做这个。不过决定采用MSP430,不知道可行否。

出0入0汤圆

发表于 2011-6-7 19:48:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-7 20:13:29 | 显示全部楼层
铁血战士出现了

出0入0汤圆

发表于 2011-6-19 23:15:41 | 显示全部楼层
楼主解决了没有,我也出现了这样的问题,改变0x0c寄存器让高低字节取反也不行,期待楼主的答复

出0入0汤圆

发表于 2011-6-22 12:02:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-22 13:22:59 | 显示全部楼层
马克一下,坐等摄像头达人

出0入0汤圆

发表于 2011-6-23 20:53:08 | 显示全部楼层
寄存器0x3a的值改为0x0c试试

出0入0汤圆

发表于 2012-5-15 16:40:39 | 显示全部楼层
PCLK反相一下

出0入0汤圆

发表于 2012-5-22 23:03:34 | 显示全部楼层
我也用相同问题,多按几次复位就可以显示。

出0入0汤圆

发表于 2012-6-11 11:30:08 | 显示全部楼层
好的,等我进展到这步再说

出0入0汤圆

发表于 2012-6-11 11:34:31 | 显示全部楼层
拍到鬼了

出0入0汤圆

发表于 2012-6-27 23:52:51 | 显示全部楼层
alanghc 发表于 2011-3-23 22:10
回复【楼主位】alanghc  
-----------------------------------------------------------------------

根据这个color bar的颜色,应该是输出的rgb顺序不对吧,从左数起第二列,本来应该是黄色(R=255,G=255,B=0)的,现在变为淡蓝(R=0,G=255, B=255),是不是可以怀疑,本来cmos输出是RGB,结果送显是BGR?

出0入0汤圆

发表于 2012-6-28 01:24:11 | 显示全部楼层
先把单色搞准

出0入0汤圆

发表于 2012-6-28 09:32:55 | 显示全部楼层
本帖最后由 xiaobenyi 于 2012-6-28 09:34 编辑

肯定是时序问题,PCLK反向一下应该可以解决,检查一下 PCLK,HSYNC,VSYNC,D0~7的走线
如果怀疑编码错位,可以试试 bayer patten 输出,或者YCbCr输出,这样可以验证到是不是时序问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 17:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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