怎么将ov7670摄像头模块的数据直接写到内存卡中

c语言单片机如何编程,使得ov7670(分辨率设置好的)八位图像,被单片机抓取存储?_百度知道
c语言单片机如何编程,使得ov7670(分辨率设置好的)八位图像,被单片机抓取存储?
c语言单片机如何编程,使得ov7670(分辨率设置好的)八位图像,被单片机抓取存储?用同分辨率尺寸的数组保存。是不是一定要完全同步的时钟?(时钟频率不对就会出现重复抓和漏抓的情况)也想过用pclk脉冲中断,但是这样是不是太耗费资源?而且不符合中断使用的情况...
我有更好的答案
配带 FIFO 的摄像头,就不怕累死MCU了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我已经使用7620行场中断来搞定了,隔行局部采样,满足了要求。不过还是采样你的吧,谢谢热心帮助
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。OV7670配置和调试总结
废话后面说,先直接上OV7670寄存器的配置部分const uint8_t OV7670_Reg[][2]={
//Frame Rate Adjustment for 24Mhz input clock
//30fps PCLK=24MHz
{0x11, 0x80},//软件应用手册上设置的是0x80,例程设置的是0x00
{0x6b, 0x0a},//PLL控制,软件应用手册上设置的是0x0a,例程设置的是0x40,将PLL调高的话就会产生花屏
{0x2a, 0x00},
{0x2b, 0x00},
{0x92, 0x00},
{0x93, 0x00},
{0x3b, 0x0a},
//Output format
{0x12, 0x14},//QVGA(320*240)、RGB
//RGB555/565 option(must set COM7[2] = 1 and COM7[0] = 0)
{0x40, 0x10},//RGB565,effective only when RGB444[1] is low
{0x8c, 0x00},
//Special effects - 特效
{0x3a, 0x04},
{0x67, 0xc0},
{0x68, 0x80},
//Mirror/VFlip Enable - 水平镜像/竖直翻转使能
{0x1e, 0x37},//修改配置值将产生图像显示上下或左右颠倒
//Banding Filter Setting for 24Mhz Input Clock - 条纹滤波器
//30fps for 60Hz light frequency
//{0x13, 0xe7},//banding filer enable
//{0x9d, 0x98},//50Hz banding filer
//{0x9e, 0x7f},//60Hz banding filer
//{0xa5, 0x02},//3 step for 50Hz
//{0xab, 0x03},//4 step for 60Hz
//{0x3b, 0x02},//select 60Hz banding filer
//Simple White Balance - 白平衡
//{0x13, 0xe7},//AWB、AGC、AGC Enable and ...
//{0x6f, 0x9f},//simple AWB
//AWBC - 自动白平衡控制(Automatic white balance control)
//{0x43, 0x14},//用户手册里这些寄存器的值都是保留(Reserved),不用设置的呀?
//{0x44, 0xf0},
//{0x45, 0x34},
//{0x46, 0x58},
//{0x47, 0x28},
//{0x48, 0x3a},
//AWB Control
//{0x59, 0x88},//用户手册连寄存器都是保留,初始值都没提供
//{0x5a, 0x88},
//{0x5b, 0x44},
//{0x5c, 0x67},
//{0x5d, 0x49},
//{0x5e, 0x0e},
//AWB Control
//{0x6c, 0x0a},
//{0x6d, 0x55},
//{0x6e, 0x11},
//{0x6f, 0x9f},
//AGC/AEC - Automatic Gain Control自动增益补偿/Automatic exposure Control自动曝光控制
//{0x00, 0x00},
//{0x14, 0x20},
//{0x24, 0x75},
//{0x25, 0x63},
//{0x26, 0xA5},
//AEC algorithm selection - AEC公式选择
//{0xaa, 0x94},//基于平均值的AEC算法Average-based AEC algorithm/基于直方图的AEC算法Histogram-based AEC algorithm
//基于直方图的AGC/AEC的控制
//{0x9f, 0x78},
//{0xa0, 0x68},
//{0xa6, 0xdf},
//{0xa7, 0xdf},
//{0xa8, 0xf0},
//{0xa9, 0x90},
//Fix Gain Control - 固定增益控制
//{0x69, 0x5d},//Fix gain for Gr channel/for Gb channel/for R channel/for B channel
//Color saturation 颜色饱和度 + 0
//{0x4f, 0x80},
//{0x50, 0x80},
//{0x51, 0x00},
//{0x52, 0x22},
//{0x53, 0x5e},
//{0x54, 0x80},
//{0x58, 0x9e},
//Brightness - 亮度 + 0
//{0x55, 0x00},
//Contrast - 对比度 + 0
//{0x56, 0x40},
//Gamma Curve - 伽马曲线
//{0x7a, 0x20},
//{0x7b, 0x1c},
//{0x7c, 0x28},
//{0x7d, 0x3c},
//{0x7e, 0x55},
//{0x7f, 0x68},
//{0x80, 0x76},
//{0x81, 0x80},
//{0x82, 0x88},
//{0x83, 0x8f},
//{0x84, 0x96},
//{0x85, 0xa3},
//{0x86, 0xaf},
//{0x87, 0xc4},
//{0x88, 0xd7},
//{0x89, 0xe8},
//Matrix Coefficient - 色彩矩阵系数
//{0x4f, 0x80},
//{0x50, 0x80},
//{0x51, 0x00},
//{0x52, 0x22},
//{0x53, 0x5e},
//{0x54, 0x80},
//Lens Correction Option - 镜头补偿选项
//{0x62, 0x00},
//{0x63, 0x00},
//{0x64, 0x04},
//{0x65, 0x20},
//{0x66, 0x05},
//{0x94, 0x04},//effective only when LCC5[2] is high
//{0x95, 0x08},//effective only when LCC5[2] is high
//注释这些配置的话,就倾斜显示,并显示多块,这到底是控制什么的?跟时序图有关?
{0x17, 0x16},//行频Horizontal Frame开始高八位(低三位在HREF[2:0])
{0x18, 0x04},//行频Horizontal Frame结束高八位(低三位在HREF[5:3])
{0x19, 0x02},//场频Vertical Frame开始高八位(低二位在VREF[1:0])
{0x1a, 0x7b},//场频Vertical Frame结束高八位(低二位在VREF[3:2])
{0x32, 0x80},//HREF
{0x03, 0x06},//VREF
//注释这个配置的话,就显示花屏了
{0x15, 0x02},//配置PCLK、HREF、VSYNC相关
//Automatic black Level Compensation - 自动黑电平校正
{0xb0, 0x84},//调试时注释这项配置时,颜色显示不正常了,红色练绿色,绿色变红色,但用户手册对这寄存器是保留RSVD
//{0xb1, 0x0c},
//{0xb2, 0x0e},
//{0xb3, 0x82},
//{0xb8, 0x0a},
//SCALING_xx寄存器
//{0x70, 0x00},
//{0x71, 0x00},
//{0x72, 0x11},
//{0x73, 0x08},
//{0x3e, 0x00},
//{0x37, 0x1d},//ADC控制ADC Control
//{0x38, 0x71},//ADC和模拟共模控制ADC and Analog Common Mode Control
//{0x39, 0x2a},//ADC偏移控制ADC Offset Control
//零杂的寄存器
//{0x92, 0x00},//空行低八位Dummy Line low 8 bits
//{0xa2, 0x02},//像素时钟延时
//{0x0c, 0x0c},
//{0x10, 0x00},
//{0x0d, 0x01},
//{0x0f, 0x4b},
//{0x3c, 0x78},
//{0x74, 0x19},
//用户手册里这几个寄存器都是保留RSVD
//{0x0e, 0x61},
//{0x16, 0x02},
//{0x21, 0x02},
//{0x22, 0x91},
//{0x29, 0x07},
//{0x33, 0x0b},
//{0x35, 0x0b},
//{0x4d, 0x40},
//{0x4e, 0x20},
//{0x8d, 0x4f},
//{0x8e, 0x00},
//{0x8f, 0x00},
//{0x90, 0x00},
//{0x91, 0x00},
//{0x96, 0x00},
//{0x9a, 0x80},
刚开始学OV7670摄像头,我想大家跟我一样心里很毛躁吧,一个模块需要你配置100多个寄存器,但用户手册对寄存器的介绍却草草的一笔带过,自己无从下手啊,只能看开发板给的例程和上网找一些大虾的帖子了。虽然开发板提供的例程好用,但是光用别人的配置不行,怎么也得根据自己实际的需要去修改这些寄存器的配置,所以就静下心里好好看中英文用户手册和OV7670_software_application_note文档。中文用户手册翻译错误太多,建议看英文的,还有强烈推荐看下OV7670_software_application_note文档,文中简单介绍了针对不同的模式对OV7670寄存器设置。
遇到问题我喜欢化繁为简,挑重点的先解决。看到OV7670寄存器中挺多设置是针对摄像头拍摄图像质量方面的,比如自动白平衡(AWB)、自动曝光控制(AEC)等等,当不知道摄像头拍摄的图片是否能在LCD上正常显示时,你修改这部分配置只能说是做无用功。所以首要任务是让摄像头拍摄的图像能显示在LCD上,我用“//”注释了暂时对于我们来说无关紧要的寄存器配置,100多个寄存器,现在只需要配置20多个,一目了然了吧,如果你的摄像头采集的图像不能在LCD上正常显示,参照用户手册修改这20多项即可,当然得先保证相关的硬件接口正确。后期为了调节图像效果,去掉相应的“//”注释符即可。
最上面的程序对寄存器配置部分就是我参照论坛里wangguanfu大侠提供的配置文件和OV7670_software_application_note文档,自己通过调试归纳总结的,希望能对大家有点帮助吧,大家一起交流,共同进步。附上我参考的PDF文档
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!->【FPGA摄像头图像开发联盟】
在Cypress提供的上位机Bulkloop块传输例子中采集一帧640*480的图像数据,然后生成BMP图像,但是始终不能采集完全一帧数据(307200字节),xfer&307200,不知道为什么会小于307200,是因为时间延迟还是需要添加其他命令方式控制下位机,已经困扰了好多天。在采集代码的函数中首先用控制端点发送请求,然后用块传输接收数据,采集函数代码如下:
LONG xfer = 640*480; //每次读取数据的大小
//传输命令
CtlEndpt-&Target & &= TGT_DEVICE;&
CtlEndpt-&ReqType & = REQ_VENDOR;
CtlEndpt-&Direction = DIR_TO_DEVICE;
CtlEndpt-&ReqCode & = 0xa1;
CtlEndpt-&Value & & = 0;
CtlEndpt-&Index & & = 0;
PUCHAR buf1=new UCHAR[1]; & &
ZeroMemory(buf1, 1); & &
LONG buflen = &1; & &
buf1[0]=0xa1; &&
CtlEndpt-&XferData(buf1,buflen);
BulkInEpt-&TimeOut = 200;
success = BulkInEpt-&XferData(rgb565Buf, xfer);&
str.Format("%d",xfer); &//xfer&307200,不知道为什么会小于307200,
MessageBox(str);
if(false == success)
delete [] buf1;
delete [] buf1;
//bayer数据格式转换为RGB888格式
BayerToRGB24(rgb565Buf,rgb24Buf,bmpWidth,bmpHeight);
ReverseImage(rgb24Buf); //反转图像数据
//将图像数据存盘
char writePath[]="Bayer8ToRGB24.bmp";
//保存为bmp图像
SaveBmp(writePath, rgb24Buf, bmpWidth, bmpHeight, 24, pColorTable);
//在界面上进行图像的显示
hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"..\\CyUSBDevice\\Bayer8ToRGB24.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_staticBmp.SetBitmap(hbitmap);
DeleteObject(hbitmap); &//释放位图句柄资源,减少内存消耗查看: 2691|回复: 0
ov7670摄像头分辨率设置方法详解
最近一直在纠结如何把 OV7670 输出的 图片分辨率缩小,以减少数据量来适应数据的传输, 在网上看了好多也没有关于寄存器的具体设置,最终又读了几遍数据手册,加上网友们写的 帖子的启发,总结出如下结论,希望大家批评指正。Ov7670 的寄存器中跟分辨率有关的寄存器主要是一下几个:0x17 HSTART& && && && && &输出格式-行频开始高八位(低三位在HREF[2:0])0x18 HSTOP& && && && &&&输出格式-行频结束高八位(低三位在HREF[5:3])0x19 VSTRT& && && && && &输出格式-场频开始高八位(低二位在VREF[1:0])0x1A VSTOP& && && && &&&输出格式-场频结束高八位(低二位在 VREF[3:2])0x03 VREF& && && && && &位[3:2]VREF 结束的低两位(高八位见VSTOP[7:0] 位[1:0]VREF 开始的低两位(高八位见 VSTOP[7:0]0x32 HREF& && && && &&&读写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& && && && && &HSTOP& && && && &&&VSTART& && && && &&&VSTOP184& && && && &&&40& && && && &&&10& && && && &&&490 先看一下 HREF 的意义:
1.001.jpg (16.5 KB, 下载次数: 19)
17:02 上传
可以看出 HREF 的高电平宽度等于我们所要显示的一行像素的数据的个数: HREF = WEIGHT*2;& && && && &&&乘以二是因为每个像素点是有两个数据HSTOP=START +&&HREF;184 + 320*2 =&&824;可是 HSTOP 是 40;& && && && &&&这里的 40 是 824%784 得到的 为什么对 784 取余数可以看下数据手册中的这个图:
1.002.jpg (24.84 KB, 下载次数: 18)
17:02 上传
计算 PCLK 的参数,如下:
VSYNC: 510* Line =&&3*tLine +&&15*tLine +480*tLineHREF: 784*tP = 640*tP +&&144*tPHSYNC: 784*tP =&&80*tP +&&45*tP +&&640*tP +&&19*tP VGA RGB565, YUV 30fps:PCLK = 784 * 510 * 30 * 2(byte) = &&= 24MHz
再看 VGA 和 QVGA& && && && && &的区别:
1.003.jpg (8.48 KB, 下载次数: 8)
17:02 上传
通过这几幅图可以看出来 VSTART& && && && && &VSTOP 这两个寄存器决定了采集的行数也就是高度 VSTART& &= HEIGHT*2 +&&VSTOP;通过比较 QVGA 和 VGA 时序的区别可以看出 乘以二的 原因
这样我们就可以写一个简单的函数来设置 OV7670 的分辨率了输入图像的行起始点,场起始点, 宽度 ,高度计算得到相应寄存器的值 编译环境:keil mdkvoid OV7670_config_window(u16 startx,u16 starty,u16 width, u16 height){u16 endx=(startx+width*2)%784;u16 endy=(starty+height*2);u8 x_reg, y_u8 state,
state = rdOV7670Reg(0x32, &x_reg );x_reg &=&&0xC0;state = rdOV7670Reg(0x03, &y_reg );y_reg &=&&0xF0;
//设置 HREFtemp = x_reg|((endx&0x7)&&3)|(startx&0x7);state = wrOV7670Reg(0x32, temp );temp = (startx&0x7F8)&&3;state = wrOV7670Reg(0x17, temp );temp = (endx&0x7F8)&&3;state = wrOV7670Reg(0x18, temp );
//设置 VREFtemp = y_reg|((endy&0x3)&&2)|(starty&0x3);state = wrOV7670Reg(0x03, temp );temp = (starty&0x3FC)&&2;state = wrOV7670Reg(0x19, temp );temp = (endy&0x3FC)&&2;state = wrOV7670Reg(0x1A, temp );}
我们设置 OV7670_config_window(184,10,320,240)的图片如下:
1.004.jpg (15.39 KB, 下载次数: 13)
17:02 上传
1.005.jpg (5.21 KB, 下载次数: 8)
17:02 上传
我们设置 OV7670_config_window(184,10,160,120)的图片为:
同理设置 OV7670_config_window(184+160*2,10+120*2,160,120)的图片为:
1.006.jpg (4.59 KB, 下载次数: 15)
17:02 上传
微笑 smile
完整的pdf格式文档51黑下载地址(共4页):
(250.63 KB, 下载次数: 15)
17:04 上传
点击文件名下载附件
下载积分: 黑币 -5
Powered by基于ov7670摄像头的视频采集和传输_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于ov7670摄像头的视频采集和传输
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 摄像头内存卡安装方法 的文章

 

随机推荐