【GD32F350 都市青年家庭安防卫士 】第九贴 GD32如何进行图像处理
[复制链接]
本帖最后由 传媒学子 于 2018-10-10 22:43 编辑
【GD32F350 都市青年家庭安防卫士 】第九贴 GD32如何进行图像处理
前言 图像一般来说都是由像素点阵组成的,一般来讲,都是占用较大内存的。但在自动驾驶,机器人视觉以及一般的视频图像处理中,对于速率都是要求较高的。因此,如何合理利用GD32F350这款arm处理器来进行特定的图像算法,还是需要认真规划研究的。 这里,我分享一下,我自己的算法思路。
一、思路解析 此次,我是用于特定领域的家庭安防,主要是针对都市生活的上班族,特别是白天上班,家里没人的一类人。方案,是采用低功耗,低成本的,较高准确度的安防解决方案。 因此,尽量系统采用这款芯片自带的SDRM和FLASH来解决。
而,GD32F350自带DMA, 16KB SDRM和128KBflash, 各项外设应有尽有,而且内部振荡器可以很容易通过内部的PLL生成108MHz的主频,非常适合这个项目。
在第八贴中,我读到了81X50大小的灰度图像,如果你按照这个图像大小进行算法处理,你会发现内存(SDRM)会不够用的. 为了能够比较两幅图像的不同,我至少需要存储两幅4050Bytes大小的图像, 两幅的话就占用了8Kb的内存,还算可以。但是,我们再采集图像是,是用的GPIOC PC6~PC13,那么DMA传输,需要16-bit. 因此,需定义一个大小为4050 宽度为16-bit的内存,这就又8Kb, 你会发现已经满了。。。
二、具体实施
所以,在实际操作中,我是这样定义的:
- __IO uint16_t data_buf[4050]={0}; //从I/0取图像[/color]
- [color=#001004]uint8_t image_buf[4050]={0}; //输出81*50的8-bit灰度图像;[/color]
- [color=#001004]uint8_t data0[450] ={0};[/color]
- [color=#001004]uint8_t data1[450] ={0};//存储当前帧图像[/color]
- [color=#001004]uint8_t data2[450] ={0};//存储上帧图像
复制代码
也就是我在我的图像中,挑选了450个特征点进行检测,当然,你可以选用其它的算法。
在比较的过程中,最好是关闭场行中断,可以隔一帧,一帧采集图像,另一帧进行算法分析,这是智能车模大赛中常用的解决方法。
三、为什么我不用二值化处理?
因为,兆易创新的这款arm内存还算可以,所以我没有必要再次压缩图像。另外,一个重要的因素,如果我采用二值化处理,你的图像会随着室内亮度变化,需要随时更改比较阈值,我觉得是麻烦的,阈值的选择会极大的影响判断的准确度。
四、实际效果
从实际测得效果来看,还是很准确灵敏的。
五、通过matlab来将81*50的8bit灰度图像显示出来
在最后,我给大家分享一下我的学习心得:
串口数据打印时,数据以printf(" %0.3d " , (uint8_t)data_buf) 显示, 行结束打印printf("\r\n"); 打印完成时,将数据拷贝到txt文件中,保证文件行列一致。
打开matlab, 输入a = [ ]; 然后拷贝txt中的数据至[ ]中,亦可以load或者importdata等形式读取图像矩阵。
此时,imshow(a) 会出现一幅图片,有时会是白色的,那么代表你的数据被matlab认为是double类型了 不要着急,用imshow(a,[ ])显示即可。
而此时获取的图像是左右上下倒置的,你可以采用 左右翻转:a = fliplr(a); 上下翻转:b = flipud(a); 用imshow(a,[ ]) 即可获取你的想要的图片。
enjoy it.
附件,是这幅图像的原始数据,感兴趣的可以按照我的方法试一下。
最后,不得不说,用GD32来处理图像还是很好的。
End~
|