基于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后,接收会出现乱码,因此串口使用的图片数据非常缓慢。

四、项目演示

相关文章
|
9天前
|
机器学习/深度学习 API Android开发
视觉智能平台常见问题之判断摄像头抓拍到包含人脸的照片如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
23 0
|
9天前
|
传感器 存储 编解码
图像采集系统
图像采集系统
28 1
|
5月前
|
存储 算法 搜索推荐
pacs系统源码,医学图像信息的快速采集、传输、存储、显示和后处理
PACS系统以实现医学影像数字化存储、诊断为核心任务,从医学影像设备(如CT、CR、DR、MR、DSA、RF等)获取影像,集中存储、综合管理医学影像及病人相关信息,建立数字化工作流程。 系统可实现检查预约、病人信息登记、计算机阅片、电子报告书写、胶片打印、数据备份等一系列满足影像科室日常工作的功能,并且由于影像数字化存储,用户可利用影像处理与测量技术辅助诊断、方便快捷地查找资料或利用网络将资料传输至临床科室
|
9月前
|
监控 数据可视化 计算机视觉
Baumer工业相机堡盟相机如何使用CameraExplorer查看相机图像Buffer以及图像数据传输流统计信息
Baumer工业相机堡盟相机如何使用CameraExplorer查看相机图像Buffer以及图像数据传输流统计信息
73 0
Baumer工业相机堡盟相机如何使用CameraExplorer查看相机图像Buffer以及图像数据传输流统计信息
|
10月前
|
存储 数据可视化 数据管理
处理RGB-D图像数据以构建室内环境地图并估计相机的轨迹
视觉同步定位和映射 (vSLAM) 是指计算摄像机相对于周围环境的位置和方向,同时映射环境的过程。 您可以使用单眼摄像头执行 vSLAM。但是,深度无法准确计算,估计的轨迹未知,并且随着时间的推移而漂移。要生成无法从第一帧开始三角测量的初始地图,必须使用单眼相机的多个视图。更好、更可靠的解决方案是使用 RGB-D 相机,它由一个 RGB 彩色图像和一个深度图像组成。
125 0
|
11月前
|
机器学习/深度学习 JavaScript 前端开发
Mediapipe三维实时人体关键点检测与追踪(一)
Mediapipe三维实时人体关键点检测与追踪(一)
914 0
|
11月前
|
计算机视觉
Mediapipe三维实时人体关键点检测与追踪(二)
Mediapipe三维实时人体关键点检测与追踪(二)
462 0
|
机器学习/深度学习 传感器 算法
【车道检测】基于帧差法结合hough实现车道检测含播报声音附GUI界面
【车道检测】基于帧差法结合hough实现车道检测含播报声音附GUI界面
|
Ubuntu 开发工具
TI AWR1843毫米波雷达采集三维点云数据(ROS)
TI AWR1843毫米波雷达采集三维点云数据(ROS)
710 0
TI AWR1843毫米波雷达采集三维点云数据(ROS)