【RT-Thread作品秀】基于ART-PI的数字图像处理与识别

一.概览

本人虽然是电子信息技术专业出身,在毕业后从事的是偏软件的工作,大多数是PC软件的开发,但一直以来,闲暇时间会利用STM32做些小的作品。对于RT-Thread这国内的物联网操作系统,其实早有耳闻,期间也参加过深圳的一次RT-Thread线下交流活动,所以对于RT-Thread是有所了解而未实际应用的程度。


借着此次RT-Thread大赛的机会,我想将PC的一些图像处理和图像识别算法放到art-pi试跑一下看看效果如何,所以本次参赛将会使用art-pi获取OV7670的图像来做像处理和图像识别。

二.开发环境

硬件:PC、ART-PI、OV7670、RGB_LCD


RT-Thread版本:rt-thread4 .0.3,art-pi adk 1.1.0


开发工具及版本:立创EDA,RT-Studio,SecureCRT

三.RT-Thread使用情况概述


线程:创建图像处理线程用于通过DCMI获取OV7670的图像,图像处理后完显示在LCD上


信号量:用于DCMI图像获取,当捕捉完一帧图像后,释放信号量给图

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一.概览 本人虽然是电子信息技术专业出身,在毕业后从事的是偏软件的工作,大多数是PC软件的开发,但一直以来,闲暇时间会利用STM32做些小的作品。对于RT-Thread这国内的物联网操作系统,其实早有耳闻,期间也参加过深圳的一次RT-Thread线下交流活动,所以对于RT-Thread是有所了解而未实际应用的程度。 借着此次RT-Thread大赛的机会,我想将PC的一些图像处理图像识别算法放到art-pi试跑一下看看效果如何,所以本次参赛将会使用art-pi获取OV7670的图像来做像处理图像识别。 二.开发环境 硬件:PC、ART-PI、OV7670、RGB_LCD RT-Thread版本:rt-thread4 .0.3,art-pi adk 1.1.0 开发工具及版本:立创EDA,RT-Studio,SecureCRT 三.RT-Thread使用情况概述 线程:创建图像处理线程用于通过DCMI获取OV7670的图像,图像处理后完显示在LCD上 信号量:用于DCMI图像获取,当捕捉完一帧图像后,释放信号量给图像处理线程。 驱动:使用了drv_dcmi驱动并参考drv_ov2640移植drv_ov7670驱动 四.实现功能展示 通过摄像头采集图像进行图像识别,然后将结果显示在LCD屏幕上。 五.硬件框架 本次的硬件核心由ART-PI、OV7670、LCD三部分组成: ART-PI:stm32H750作为控制核心部分,采集图像源数据、处理图像源生成处理结果、将处理结果送到LCD显示 OV7670:作为图像源,提供320*240的RGB565图像 LCD:实时显示图像源图像和显示处理结果 六.软件流程图 1. 硬件初始化:时钟、I2C、DCMI、SDRAM、LTDC 2. 进入图像处理线程,启动拍照并等待拍照完成信号量 3. 完成拍照释放拍照完成信号量 4. 得到图像后,进行图像处理图像识别 5. 将图像识别结果在LCD上显示 6. 回到步骤2 七.图像识别功能介绍 通过DCMI驱动获取OV7670的分辨率为320*240的RGB565原始图像。RGB565每个像素使用用下图的方式存储,每个像素占用2个字节。所以每帧320*240的图像所需内存为320*240*2=153600字节。 实际上,我们在这次项目中并不需要使用到彩色特征,所以先将RGB565转换为灰色度。灰度图其实就是每个像素占用一字节,用0-255值来形容一个像素的灰度值。因此320*240所占用的内存为76800字节。 RGB565转灰度图公式如下:Gray = R*0.299 + G*0.587 + B*0.114 提取的灰度图后,我们还需要再进行一次二值化处理,因此设定一个阈值,当灰色像素大于这个阈值我们将它改为255,低于这个值变成0。这样就得到一帧只有0和225值的图像。 得到二值化图像后,我们便可以寻找要识别物体了。在此使用九宫格的方式提取连通分量,原理其实很简单,就是在九宫格里寻找连在一起的像素,如果能找到便将该像素便将该像素的坐标(位于X行,y列)写入到链表里。如此循环,直到找完所有像素。 完成连通分量的提取后便是特征提取了,我们还是采用九宫格分割法,将取得的图像平均分割为9个区域,再计算9个区域中值为255像素的个数。通过这一步算法,我们得到了9组特征数据。 本次用了两种特征提取方式: 1.通过水平与垂直方向的穿越数找出部分数字 以数字0和7为例,在1/2宽度处,0和7稳定的得到垂直穿越数是2.而在1/2高度,0的水平穿越数是2,7的水平穿越数是1. 2.在图像的水平和垂直的中间切分成四块,根据四个部分不同像素比例找出其他数字。以2和3为例 ,在右下角部分,3的每一行都会有像素点,而2会缺几行。因此2的像素更少从而区分2和3。 最终检测效果如下图: 八.比赛感悟 虽然标题是比赛感悟,实际上比赛并不是我的目的。RT-Thread我知道它更久了,但是一直没有去更进一步使用RT-Thread。这次比赛让我深入了解了RT-Thread的生态系统,给我的感觉真的太惊喜了。RT-Thread平台拥有丰富的组件,完善的各种外设驱动,通过官方的RT-Studio基本上做到入手即用了。 当时拿到ART-PI,通过RT-Thread SETTING进行勾选,再使用CubeMX选择外设,生成引脚初始化代码后。我本次项目的软件基本平台已经完成了,我只需要专注于我的应用层开发便可以了,这真的是太便利了。 通过本次比赛,让我对RT-Thread获得相当大的好感,我想未来硬件项目当中,我会毫不犹豫的选择RT-Thread代替其他实时操作系统
作者:Signx 概述 当前的人脸识别摄像头,价格昂贵,拟改造成stm32单片机版本的,节省成本 功能: 1.连接摄像头OV2640,用fish指令开启摄像头 2.将摄像头数据传到电脑显示图片 3.将摄像头数据传到spi显示屏显示(未完成) 4.用人脸识别算法识别人脸开锁(未完成) 5.可登录到tencent Cloud云平台,实现上云 开发环境: 硬件:Art-pi+OV2640 RT-Thread版本:4.0.2 开发工具及版本:rt-stuidio V2.0.0 RT-Thread使用情况概述: 硬件框架:art-pi官方开发板+OV2640(dma+DCMI) 软件框架说明: 见思维导图 软件模块说明: 见思维导图 该系统的思维脑图如下: 演示效果: 视频: 实物图如下: 实现的效果如图: 连接电路如图所示: 实现功能: 1.连接摄像头OV2640,用fish指令开启摄像头 2.将摄像头数据传到电脑显示图片 3.将摄像头数据传到spi显示屏显示(未完成) 4.用人脸识别算法识别人脸开锁(未完成) 5.可登录到tencent Cloud云平台,实现上云主要碰到的技术难点: 1.art-pi组建库里有ov2640的软件包,本以为直接能用的,结果发现有很多缺失 首先是io口的确实,没有定义到足够的io口,所以代码里又加上了io口的定义以及初始化: io口定义代码: typedef enum { BMP_QQVGA = 0x00, /* BMP Image QQVGA 160x120 Size */ BMP_QVGA = 0x01, /* BMP Image VGA 800*480 Size */ JPEG_160x120 = 0x02, /* JPEG Image 160x120 Size */ JPEG_176x144 = 0x03, /* JPEG Image 176x144 Size */ JPEG_320x240 = 0x04, /* JPEG Image 320x240 Size */ JPEG_352x288 = 0x05 /* JPEG Image 352x288 Size */ }ImageFormat_TypeDef; /*摄像头接口 */ //IIC SCCB //#define CAMERA_I2C I2C1 //#define CAMERA_I2C_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE() // //#define CAMERA_I2C_SCL_PIN GPIO_PIN_8 //#define CAMERA_I2C_SCL_GPIO_PORT GPIOB //#define CAMERA_I2C_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //#define CAMERA_I2C_SCL_AF GPIO_AF4_I2C1 // //#define CAMERA_I2C_SDA_PIN GPIO_PIN_9 //#define CAMERA_I2C_SDA_GPIO_PORT GPIOB //#define CAMERA_I2C_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //#define CAMERA_I2C_SDA_AF GPIO_AF4_I2C1 //VSYNC #define DCMI_VSYNC_GPIO_PORT GPIOI #define DCMI_VSYNC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() #define DCMI_VSYNC_GPIO_PIN GPIO_PIN_5 #define DCMI_VSYNC_AF GPIO_AF13_DCMI // HSYNC #define DCMI_HSYNC_GPIO_PORT GPIOH #define DCMI_HSYNC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE() #define DCMI_HSYNC_GPIO_PIN GPIO_PIN_8 #define DCMI_HSYNC_AF GPIO_AF13_DCMI //PIXCLK #define DCMI_PIX
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值