新手上路
- 积分
- 49
- 金钱
- 49
- 注册时间
- 2019-6-27
- 在线时间
- 17 小时
|
1金钱
最近在搞摄像头的处理。用到的摄像头是0v7670的320*240像素,已经把图像灰度化了,想把灰度化放在数组里方便之后滤波处理。
因为存储器大小的问题,就想着降低像素。一开始想着降到150*150(44k)应该差不多了。
用的是F10zet6的芯片,外部有64K的RAM,但是没有成像,后来降到100*100也没有成像,【如下附上代码】
我这样子降分辨率 也还是没有用。后来降到60*60的时候成像了(60*60*2/1024=11.8K 难道要这么小才行吗!!!!!说好的64K呢!!!!)。但是当我调成61*61的时候LCD上的图像又错位了
如图
所以像这次发帖问一下大家,这个摄像头存储的问题,还有这个错位的问题
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "string.h"
#include "ov7670.h"
#include "ov7725.h"
#include "tpad.h"
#include "timer.h"
#include "exti.h"
#include "usmart.h"
#include "IIC.h"
/************************************************
ALIENTEK精英STM32开发板实验33
摄像头OV7670 实验
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
//传感器名字宏定义
#define OV7725 1
#define OV7670 2
//由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
//注意:此宏定义只对OV7725有效
#define OV7725_WINDOW_WIDTH 320 // <=320
#define OV7725_WINDOW_HEIGHT 240 // <=240
#define xpoint 150
#define ypoint 150
const u32 totalcount=xpoint*ypoint;
extern u8 ov_sta; //在exit.c里 面定义
extern u8 ov_frame; //在timer.c里面定义
void OV7670_camera_refresh(void)
{
u32 j;
u16 color;
if(ov_sta)//有帧中断更新
{
LCD_Scan_Dir(U2D_L2R);//从上到下,从左到右
if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window(0,0,xpoint,ypoint);//将显示区域设置到屏幕中央
LCD_SetCursor(0x00,0x0000); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
OV7670_RRST=0; //开始复位读指针
OV7670_RCK_L;
OV7670_RCK_H;
OV7670_RCK_L;
OV7670_RRST=1; //复位读指针结束
OV7670_RCK_H;
for(j=0;j<xpoint*ypoint;j++)
{
OV7670_RCK_L;
color=GPIOC->IDR&0XFF; //读数据
OV7670_RCK_H;
color<<=8;
OV7670_RCK_L;
color|=GPIOC->IDR&0XFF; //读数据
OV7670_RCK_H;
LCD->LCD_RAM=color;
}
ov_sta=0; //清零帧中断标记
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
}
}
u8 RGBtogray(u16 changecolor) //RGB565 转 灰度
{
u8 gray;
u16 r,g,b;
r=(changecolor&0xf100)>>11;
g=(changecolor&0x07e0)>>6;
b=changecolor&0x1f;
gray=(r*3/31+g*6/63+b*3/31)*25;
return gray;
}
int main(void)
{
u8 sensor=0;
u8 key;
u8 i=0;
u16 hang,lie;
u8 a[totalcount];
u8 msgbuf[15];//消息缓存区
u8 lightmode=0,effect=0;
s8 saturation=0,brightness=0,contrast=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为 115200
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
OV7670_Init();
OV7670_Light_Mode(lightmode);
OV7670_Color_Saturation(saturation);
OV7670_Brightness(brightness);
OV7670_Contrast(contrast);
OV7670_Special_Effects(effect);
OV7670_Window_Set(12,174,ypoint,xpoint);//设置窗口 12 174 240 320
OV7670_CS=0;
TIM6_Int_Init(10000,7199); //10Khz计数频率,1秒钟中断
EXTI8_Init(); //使能外部中断8,捕获帧中断
LCD_Clear(BLACK);
while(1)
{
OV7670_camera_refresh();
for(hang=0;hang<xpoint;hang++)
{
for(lie=0;lie<ypoint;lie++)
{
a[hang+lie]=RGBtogray(LCD_ReadPoint(lie,hang));
if(RGBtogray(LCD_ReadPoint(lie,hang))<50)
{
POINT_COLOR=BLACK;
LCD_DrawPoint(lie,hang);
}
else
{
POINT_COLOR=WHITE;
LCD_DrawPoint(lie,hang);
}
}
}
}
}
|
|