×

基于ART-PI的数字图像处理与识别

消耗积分:0 | 格式:rar | 大小:6.22 MB | 2022-12-30

香香技术员

分享资料个

方案介绍

一.概览

  本人虽然是电子信息技术专业出身,在毕业后从事的是偏软件的工作,大多数是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代替其他实时操作系统。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'基于ART-PI的数字图像处理与识别',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);