基于RT-Thread摄像头车牌图像采集系统

简介: 该项目使用AB32VG1开发板基于RT-thread操作系统,结合ov7670摄像头捕获图像,并通过串口以RGB565格式传输到PC进行图像识别。然而,开发板实际可用RAM仅为70k,低于预期,导致无法在板上进行图像处理。原本计划的LCD屏幕因IO口不足而放弃,但保留了相关SPI代码。目前,摄像头数据采集和串口发送功能已完成,可正常工作。硬件包括csi接口的ov7670摄像头、PL2302串口工具。软件部分有详细的流程图和关键代码展示,其中串口通信速度限制为115200bps,低于上位机接收能力,造成效率不高。项目还展示了部分演示结果。

一、项目简介

使用基于RT-thread操作系统的AB32VG1开发板作为主控,对ov7670摄像头进行图像采集,并使用串口发送图片RGB565格式到PC供opencv进行图像识别。 原项目设想在开发板上进行采集的同时并通过简单的二值算法和插值算法实现车牌号识别,但实践中发现开发板的ram并不够保存采集回来的图像信息,与数据手册中介绍的192k有一定差距,实现用户能使用的ram是70k;同时原设想是带lcd屏幕的,但最后发觉io口数量不够,只能通过串口调试显示,但lcd屏幕的 spi代码仍保留在原码中,可供参考。 目前开发板通过摄像头采集完整数据部分已经完成,并且可以通过串口uart1发送到上位机进行图像显示。

二、硬件说明

1.摄像头ov7670带fifo:采用csi总线的普通30w摄像头。考虑到用模拟读取摄像头,io的反转速度可能不能满足高速采集的需要,因此保险起见,直接使用带fifo的摄像头。sccb总线采用全模拟的方式,跳过了所有中间层,直接操作寄存器,提高了总线的时钟。

2.串口工具PL2302(ttl转RS232),一款与pc通讯的串口工具,免驱。

3.总接线图

三、软件说明

1.软件流程图

2.关键代码

/* 摄像头IO口采用直接操作寄存器的方式实现,极大提升io速度 */
#define BSP_FIFO_RCK_PIN            "PA.5"
#define BSP_FIFO_RCK_SET_LOW         (GPIOA_BASE[GPIOx] &= ~(1ul << 5))
#define BSP_FIFO_RCK_SET_HIGH         (GPIOA_BASE[GPIOx] |= (1ul << 5))
/* sccb总线的初始化并设置ov7670相应寄存器 */
    sccb_init();
    if(sccb_write_reg(0x12, 0x80) == RT_FALSE){
        return RT_FALSE;
    }
    rt_thread_delay(50);
    id1 = sccb_read_reg(0x0b);
    id2 = sccb_read_reg(0x0a);
rt_kprintf("id1 = 0x%02x, id2 = 0x%02xn", id1, id2);
    for(rt_uint16_t i = 0;i < sizeof(ov7670_init_reg_tbl) / sizeof(ov7670_init_reg_tbl[0]);i++){
        sccb_write_reg(ov7670_init_reg_tbl[0], ov7670_init_reg_tbl[1]);
}
/* 开启摄像头vsync扫描线程(没有外部中断因此改用轮询的方式实现) */
    rt_thread_t thread;
    /* 查询VSYNC线程 */
    thread = rt_thread_create("ov7670_vsync", ov7670_vsync_thread_entry, RT_NULL, 1024, 5, 100);
    if (thread == RT_NULL){
        rt_kprintf("ov7670_vsync thread create fail!n");
        return RT_FALSE;
    }
    /* 启动线程 */
rt_thread_startup(thread);
/* 提取hal库实现了uart的数据发送函数 */
void uart1_send(rt_uint8_t *pbuf, rt_uint32_t len)
{
    for(rt_uint32_t i = 0;i < len;i++){
        hal_uart_clrflag(UART1_BASE,  UART_FLAG_TXPND);
        hal_uart_write(UART1_BASE, pbuf);
        while(hal_uart_getflag(UART1_BASE, UART_FLAG_TXPND) == 0);
    }
}
/* LCD底层驱动代码,因为引脚不够,所以无法演示,测试可用,另外程序里也配有寄存器版本的操作代码 */
static rt_uint32_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *message)
{
    struct rt_spi_bit_ops *ops = (struct rt_spi_bit_ops *)device->user_data;
    rt_uint8_t tmp_buf[1024];
    rt_memset(tmp_buf, 0, sizeof(tmp_buf));
    if(message->send_buf == RT_NULL){
        message->send_buf = tmp_buf;
    }else if(message->recv_buf == RT_NULL){
        message->recv_buf = tmp_buf;
    }else{
        return RT_FALSE;
    }
    if (message->cs_take){
        ops->set_cs(ops->data, PIN_LOW);
    }
#ifdef SPI_DC
    message->length & SPI_DC ? ops->set_dc(ops->data, PIN_HIGH) : ops->set_dc(ops->data, PIN_LOW);
    message->length &= ~SPI_DC;     /* 复原消息长度 */
//    rt_kprintf("message->length = %dn", message->length);
#endif
    spi_rw_bytes(device, (rt_uint8_t *)message->send_buf, (rt_uint8_t *)message->recv_buf, message->length);
    if (message->cs_release){
        ops->set_cs(ops->data, PIN_HIGH);
    }
}
static const struct rt_spi_ops spi_bit_bus_ops ={
    RT_NULL,
    spi_bit_xfer
};

优化思路:  1. 由于ab32vg1没有外部中断可以使用,ov7670的帧同步信号vsync只有500us的高电平时间,因此为了捕捉到该信号,vsync线程一直占用很多的资源;  2. 串口与上位通讯的速度目前最快只有115200bps,上位机可以接受256000bps的速度,但将驱动改为256000bps后,接收会出现乱码,因此串口使用的图片数据非常缓慢。

四、项目演示

相关文章
|
1月前
|
传感器 存储 编解码
图像采集系统
图像采集系统
31 1
|
1月前
|
算法 计算机视觉
基于opencv的指针式仪表的识别与读数
基于opencv的指针式仪表的识别与读数
97 0
|
7月前
|
数据采集
如何使用振弦采集读数模块?
振弦采集读数模块主要用于测量振弦的振幅、频率和周期等参数。以下是使用振弦采集读数模块的基本步骤:
如何使用振弦采集读数模块?
|
10月前
|
监控 数据可视化 计算机视觉
Baumer工业相机堡盟相机如何使用CameraExplorer查看相机图像Buffer以及图像数据传输流统计信息
Baumer工业相机堡盟相机如何使用CameraExplorer查看相机图像Buffer以及图像数据传输流统计信息
88 0
Baumer工业相机堡盟相机如何使用CameraExplorer查看相机图像Buffer以及图像数据传输流统计信息
|
10月前
|
监控 算法 机器人
Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#)
Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#)
101 0
|
传感器 存储
VM系列振弦采集模块的信号检测与分析计算
振弦传感器钢弦起振后,信号强度在短时间内迅速达到最大,然后在钢弦张力及空气阻力作用下逐渐恢复静止。我们可将整个振动过程分为起振、调整、稳定、消失几个阶段,上述几个阶段中,起振和调整阶段的振动又叫做强迫振动,稳定与消失阶段合称为自主振动。
272 66
VM系列振弦采集模块的信号检测与分析计算
|
传感器
使用 VM 振弦采集测量模块测试传感器步骤
VM 模块是通用型单振弦式传感器测量模块,主要功能是测量频率的传感器内置的温度传感器,使用默认工作参数即可自动测读绝大多数振弦传感器。 但由于传感器类型、结构、厂家、钢弦材料、线圈等影响因素不同,导致使用 VM 模块测量某些传感器时需要进行参数调整来改善测量稳定性(特别是频率稳定性)。
使用 VM 振弦采集测量模块测试传感器步骤
|
传感器
VM系列振弦采集模块信号检测与采样
VMXXX 内部有振弦传感器的信号检测、 有效性检测机制, 仅信号幅值位于预设的合理区间时,才会进行数据采样, 当完成足够数量的样本采样后立即进行信号质量分析计算,得到频率、频模值及多个信号质量表征值更新于对应的只读寄存器内,读取这些寄存器值,即可得到当前测量结果数据和信号质量。
VM系列振弦采集模块信号检测与采样
|
传感器 数据采集 编解码
VM系列振弦采集模块(智能振弦传感器测量模块)其它常见问题
VM系列振弦采集模块(智能振弦传感器测量模块)其它常见问题 最新固件版本 V3.52支持智能振弦传感器测量读取功能,开发振弦采集仪功能更丰富。振弦传感器四线制嵌入电子标签专用读数模块TR01,可以读取振弦传感器内置的两线制电子标签,获取传感器数字信息(传感器型号、量程、K值、编号,出厂频率等非常全的传感器信息)。
VM系列振弦采集模块(智能振弦传感器测量模块)其它常见问题