搜索
bottom↓
回复: 282

STM32玩百万象素摄像头,分享经验

  [复制链接]

出0入0汤圆

发表于 2012-9-25 17:10:32 | 显示全部楼层 |阅读模式
本帖最后由 chunxx 于 2012-9-25 17:12 编辑

在STM32上做了一个平台,搞定了130万象素的MT9M111 CMOS Sensor接口,后来又分离出来做成一个独立模块,有时间就在上面玩玩图像算法,可以LCD预览显示,OSD叠加,压缩存储,二值化,特征提取,目标识别。。。。 广阔天地呀!呵呵,先上图:
平台:


图片:


图片2:


1280x1024这个JPEG图,就是由MT9M111捕捉、STM32压缩写到SD卡上的,4mm的小镜头,没有背光随手拍的,虽然比较暗淡没艺术感,但分辨率是硬道理啊!一直只是玩玩,看到这个图,感觉可以用来做点东西,虽然还没想好做什么。
用这个平台做过了一些USB Video Class的探索,在论坛上发过的:
http://www.amobbs.com/thread-5262477-1-1.html
程序是相通的,JPEG编码源程序也在那里。那个开始用的是OV7670,STM32 firewware还是v2.02的,后来改成MT9M111,fireware懒得升级了。
先贡献MT9M111的驱动源程序,带注释无码版本,不是原装但绝对是原创的。

这个程序,代码以外的文字总结,在我的博客上:
chunxx.21ic.org

其他的一些算法移植也小有成绩(不是成就),不过还属于玩家,也就是玩物丧志的家伙,如果打开门,有人围观起哄的话,还比较容易想起自己远大的理想,所以决定,有时间的话就上传一些源程序,分享一下心得,希望能遇到同道。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出350入8汤圆

发表于 2012-9-25 17:26:18 | 显示全部楼层
坐一下沙发!

出0入22汤圆

发表于 2012-9-25 17:29:25 | 显示全部楼层
帮顶,祝贺!                                                                                      
                                                                                 
                                                                  
                                                         
                                                               

出0入0汤圆

发表于 2012-9-25 17:44:50 | 显示全部楼层
MT9M001楼主有STM32的驱动代码吗?

出0入0汤圆

发表于 2012-9-25 17:56:46 | 显示全部楼层
很不错啊,要是有更清楚的效果图,相信大家更喜欢了。

出0入0汤圆

发表于 2012-9-25 18:04:32 | 显示全部楼层
很好!移植了OPENCV?

出0入0汤圆

 楼主| 发表于 2012-9-25 18:44:21 | 显示全部楼层
后2个图就是1280x1024的,但上传后就显示成500x400了,如果用“另存为"保存到电脑看要好些。
回4楼:没用过MT9M001,没IC也没程序,MT9M111这个也没原始程序,自己一.针一.线抠出来的。
回6楼:没敢移植OpenCV,那货太博大精深了,DSP上都不敢移植。

出0入0汤圆

发表于 2012-9-25 18:56:33 | 显示全部楼层
太高端了,顶楼主啊

出0入0汤圆

发表于 2012-9-25 19:01:51 | 显示全部楼层
mark too lz我们同城

出0入0汤圆

发表于 2012-9-25 20:19:31 | 显示全部楼层
好像很强大,顶顶顶……

出0入0汤圆

发表于 2012-9-25 20:33:35 | 显示全部楼层
顶楼主,感觉蛮好的

出0入0汤圆

发表于 2012-9-25 20:37:11 | 显示全部楼层
感觉这个比较强大了,不知道压缩一幅要多少时间

出0入0汤圆

发表于 2012-9-25 20:42:54 | 显示全部楼层
用过几个MT的摄像头,就是不会什么算法,只能采集看了

出0入0汤圆

发表于 2012-9-25 20:45:21 | 显示全部楼层
这个要顶,楼主很是强大。。

出0入0汤圆

发表于 2012-9-25 21:29:31 | 显示全部楼层
MARK,标记

出0入0汤圆

发表于 2012-9-25 21:56:52 | 显示全部楼层

MARK,标记

出0入0汤圆

发表于 2012-9-26 00:54:14 来自手机 | 显示全部楼层
收藏了,有空再研究

出0入0汤圆

发表于 2012-9-26 01:29:18 | 显示全部楼层
顶你一下。。慢慢来不要放弃,过好久会发现有质的变化。

出0入0汤圆

发表于 2012-9-26 08:54:02 | 显示全部楼层
楼主厉害!STM32做JPEG编码压缩,速度怎么样呢?大概能有多少帧哦

出0入0汤圆

 楼主| 发表于 2012-9-26 16:29:49 | 显示全部楼层
   上程序: Keil MDK下完整的Project,图像存储为JPEG和Bitmap文件。比较懒,按键也没有,通过串口发”p”切换RGB565或YUV格式,发”s”捕捉图像,编码保存到文件。当前是RGB格式存为Bitmap文件,是YUV格式就存为JPEG。包括fatfs 0.09文件系统,SDIO  4b模式存到SD卡。

    单帧JPEG编码并写入SD卡,1280x1024图像,时间约4s。Bitmap文件,时间约15.6s。
  640x480图像, JPEG时间约660ms~880ms,Bitmap文件存储约3500ms~4800ms,和SD卡有关系。
  按此总结,不管是写到SD卡还是USB、串口发出去,JPEG编码都是值得的!
   Bitmap文件是直接存储RGB565,这个还是有些道道的。摄像头和LCD,最直接是RGB565,看别人的程序,好些用的是RGB888,虽然转换很简单,每个Pixel搞一次也是严重的浪费啊。RGB565的Bitmap虽然Windows支持,但AcdSee这些就不大支持了,有点Bug,花了老大的耐心才从MSDN上找出答案,文件头格式上有些小技巧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-9-26 16:35:59 | 显示全部楼层
不错,130万像素,很好的摄像头了呀

出0入0汤圆

发表于 2012-9-26 17:43:11 | 显示全部楼层
chunxx 发表于 2012-9-26 16:29
上程序: Keil MDK下完整的Project,图像存储为JPEG和Bitmap文件。比较懒,按键也没有,通过串口发”p” ...


楼主能拍几张生活图片么,这么高的像素,真想看看正常光线下拍摄的照片效果。有意啊!

出0入0汤圆

发表于 2012-9-26 19:54:54 | 显示全部楼层
似乎用了SDRAM?

出0入0汤圆

发表于 2012-9-26 22:43:09 | 显示全部楼层
好东西 ,挺强大的啊

出0入0汤圆

发表于 2012-9-27 08:44:57 | 显示全部楼层
顶起,,coms图像

出0入0汤圆

 楼主| 发表于 2012-9-27 11:32:30 | 显示全部楼层
是用了SDRAM。有人支持就多罗唆几句。
用STM32玩摄像头,是从OV7670开始的,用BL422 FIFO的方式基本上没什么好玩的,也就能够丢到LCD显示,单帧存储,640x480的图像只能用320x240,MCU基本上没时间做其他事。不过比起模拟视频信号输出的摄像头来,它是并行数字口输出,时钟速度可调,有很大扩展的空间。模拟摄像头只能通过SAA7113之类解码,按死死板板的ITU656,27M时钟输出,不用DSP的话基本上没什么操作空间。
    不过DSP也不是天生就能上图像的,象DM642,应用板是要FPGA扩展的。自然的思路就是用CPLD扩展STM32子系统,扩大内存。STM32单以运算速度而言,应该可以达到80386的水平吧?很多经典的图像处理算法都是在386时代就有了,有了足够的内存就有玩头。SRAM大容量太贵,理想的是SDRAM,不过,现实中没有STM32接口SDRAM的例子可以参考,一切靠自己,硬来!
    在STM32上扩展8M SDRAM,FSMC接口;摄像头输出直接存入SDRAM,1280x1024的图像也足可以放上2帧;MCU直接在内存中读已经组成帧的图像,不用管象素和行怎么来的;读写分离,同时进行,这样MCU处理再慢也不影响图像捕捉;另外的冗余资源,做了一个抽取器,不管是640还是1280的图像,抽取成320x240的小图像,直接送给LCD小屏显示。
    摄像头最初还是用OV7670调试,640x480模式。通过之后改用MT9M111,接口基本相同。基本定型之后,觉得摄像头部分可以固定,MCU周边电路需要根据应用不同而修改,所以把这个扩展部分分离出来,做成一个独立模块,提供给MCU一个简单的FSMC接口,就起名叫fsmc-Camera吧!


(数码相机拍的,不是自己拍自己)
    玩这个的目的,是想把PC上用的一些图像算法移植到单片机上来,看看是否有可能做一些简单的目标识别、图像定位之类应用。JPEG编码是附带做的,反而没耗费多大精力。现在虽然没什么成就,回过头来看,路线应该是正确的。以前对CVBS图像玩得可谓精熟(06年的时候曾经做过一个STC51单片机实现的汉字OSD模块,现在还有朋友要货),但模拟视频的时代无可奈何的要消失,如果还执着于CVBS,只能离开图像这个邻域了;CMOS摄像头这一块,刚开始玩这个的时候,30万象素算高级,现在连起步价都不够了,应该是发展的方向。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-9-27 21:13:59 | 显示全部楼层
中午拍了几个图,室内自然光下,8mm监控用的那种镜头:

大约1mm外对着电脑屏幕拍,受窗边光线的影响比较明显。
换一个16mm的镜头,清晰一些,但视区变小了很多,不能把整个屏幕拍下来了:

视场和镜头是互相制约的,不过其的关系一直不大清楚,生活照片很难拍,缺少艺术细胞,要向陈老师李老师多学习才行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-9-27 21:51:05 | 显示全部楼层
赞。学习了先。

出0入0汤圆

发表于 2012-9-28 07:15:13 | 显示全部楼层
这个不错  

出0入0汤圆

发表于 2012-9-28 08:47:05 | 显示全部楼层
chunxx 发表于 2012-9-27 11:32
是用了SDRAM。有人支持就多罗唆几句。
用STM32玩摄像头,是从OV7670开始的,用BL422 FIFO的方式基本上没什 ...

LZ的想法很有预见性,学习了。将来一大趋势

出0入0汤圆

发表于 2012-9-28 14:22:10 | 显示全部楼层
楼主V5啊!在此学习!

出0入4汤圆

发表于 2012-9-28 15:15:47 | 显示全部楼层
我们菜鸟的好食物

出0入0汤圆

发表于 2012-9-28 17:36:34 | 显示全部楼层
不错不错

出0入0汤圆

发表于 2012-9-28 17:46:06 | 显示全部楼层
LZ这个 CPLD+SDRAM才是关键啊
STM32F407IGT6,虽然带DCMI,但只能接SRAM,还是鸡肋

出0入0汤圆

发表于 2012-9-28 17:52:54 | 显示全部楼层
不错,有前途

出0入0汤圆

 楼主| 发表于 2012-9-29 10:11:22 | 显示全部楼层
wangguanfu 发表于 2012-9-28 17:46
LZ这个 CPLD+SDRAM才是关键啊
STM32F407IGT6,虽然带DCMI,但只能接SRAM,还是鸡肋

王工犀利,指出了要点。
开始做这个的时候还没有F2,F4,F2出来的时候知道带有DCMI,感觉很不爽,难道又成了沙滩上的泡沫?F4出来的时候几乎想放弃了!后来仔细评估,F4虽然有DCMI,但它的SRAM并放不下大分辨率的图像,能抓图像但没地方放,没什么意思,还是可以共存的。
这个还没在STM32F407上试过。F4速度提升不少,价格下来的话值得搞搞,不过真要对速度高要求的话,不如上ARM11,Cortex-A8。

出0入0汤圆

发表于 2012-9-29 10:19:05 | 显示全部楼层
本帖最后由 wangguanfu 于 2012-9-29 10:22 编辑

STM32F407xET6+al422(Processed Bayer RAW格式)可以实现VGA分辨率 JPEG压缩,
STM32F103xET6+al422(Processed Bayer RAW格式)可以实现QVGA分辨率 JPEG压缩,
主要的问题还是RAM的问题,F407能SDRAM就真的完美了

出0入0汤圆

发表于 2012-9-30 11:50:41 | 显示全部楼层
很强大呀,顶

出0入0汤圆

 楼主| 发表于 2012-10-8 12:00:53 | 显示全部楼层
看来过节不休息的人也不少呀,一个小假过来就到了水底。
20楼贴出源码用了Lib,自己的一些底层东西都放在Lib中,主要是自己方便:有想法时就开一个Project试一下,路路续续开了好几个Project,又没有用Workspace的方法,每个Project下面都可能改这个底层,没同步到其他Project下,时间长了就搞得乱七八糟,最后选择用Lib的方式,谁也别乱改底层。Lib的源码也可开放,MT9M111.C/H就是其中之一,有兴趣读的可以直接email找我:hcc21cn#163.com. (#->@)。
JPEG和文件存储是基本功,虽然感觉良好,也没打算用来做什么。以后有时间会贴其他Project的源码上来。

出0入0汤圆

发表于 2012-10-8 12:15:24 | 显示全部楼层
chunxx 发表于 2012-10-8 12:00
看来过节不休息的人也不少呀,一个小假过来就到了水底。
20楼贴出源码用了Lib,自己的一些底层东西都放在Li ...

用不着完全开源。LIB就可以了 ,LIB里面放好版权信息
-------------------------------------------------------------------------------
看看我的那些开源的,虽算不上什么技术,但被抄防无数,不管是“名人”还是名不经转的人,个个都声称原创甚至销售。

出0入0汤圆

发表于 2012-10-8 13:41:31 | 显示全部楼层
MARK                              

出0入0汤圆

发表于 2012-10-8 15:05:34 | 显示全部楼层
还是换个ARM9吧。。。。。RAM实在是太小了点。。。。

出0入0汤圆

发表于 2012-10-8 15:06:31 | 显示全部楼层
现在A8 A9什么的也可以考虑了。。。

出0入0汤圆

 楼主| 发表于 2012-10-8 17:07:41 | 显示全部楼层
用A8 A9我觉得不如用个X86的工控板,用Windows操作系统,再用NI Vision或者xxxSight之类的商业库,什么都解决了!不过这个路数已经玩过了,想玩点新鲜的。

出0入0汤圆

 楼主| 发表于 2012-10-9 17:20:36 | 显示全部楼层
上传二值化演示程序。生成阀值,二值化图像后通过USB,以USB Video Class摄像头形式连到PC看结果。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-10-9 17:21:39 | 显示全部楼层
二值化是图像处理最简单也最麻烦的东西。说简单,就是用一个阀值,比如128,分割0~255的亮度就可以了;说复杂,一个成功的二值化,就是把图像分割成背景和目标两部分的过程,得到正确的目标部分,OCR,识别,定位什么的就成功了一大半。
经典的全局阀值二值化方法是OStu法,日本人大津前二原创,如果不爽日本人,可以称它的学名“最大类间方差法”。这方法理论上很优美,但实际用时不一定能得到理想的结果,要根据具体场合做修改。
从单帧图像到连续图像,二值化阀值没必要每帧都计算一次,也不能总不变,N帧计算一次。也可以在二值化后处理结果变化较大时立即重新计算阀值。

出0入0汤圆

发表于 2012-10-9 17:57:36 | 显示全部楼层
不知道这个摄像头在弱光环境下表现如何?

出0入0汤圆

 楼主| 发表于 2012-10-10 09:41:31 | 显示全部楼层
opoop130 发表于 2012-10-9 17:57
不知道这个摄像头在弱光环境下表现如何?

弱光环境没研究过,不能用AE,有兴趣时可以试一下

出0入0汤圆

发表于 2012-10-10 09:52:08 | 显示全部楼层
mt9m111 弱光性能不如OV7670,不过 镁光的传感器可以把帧速设置的很低长时间暴光获得清晰图象,OV的帧速却不能太低

出0入0汤圆

 楼主| 发表于 2012-10-10 10:07:55 | 显示全部楼层
wangguanfu 发表于 2012-10-10 09:52
mt9m111 弱光性能不如OV7670,不过 镁光的传感器可以把帧速设置的很低长时间暴光获得清晰图象,OV的帧速却 ...

是的,就是手工设置曝光控制寄存器,不用AE。这个很难缠,厂家资料给得很模糊,有些东西只能自己慢慢推敲。

出0入0汤圆

 楼主| 发表于 2012-10-10 16:06:47 | 显示全部楼层
显示灰度直方图:


具体应用中,二值化应该参照直方图来做,一切不看直方图的二值化方法都是耍流氓。如果直方图上有两个隆起的峰,把阀值放在两峰之间的沟沟处就基本OK,一边是背景一边是目标。如果直方图是一柱擎天,那就麻烦了,需要参照目标特征调整,而且很难调到真正的准确。偶这里可以在LCD上显示图像的灰度直方图,勉强用用。
在实践中偶更常用的是一种P分位法,Percent,记不得出自哪里了。预估目标象素占整体图像的百分比,在直方图上从高端向低搜索直到积累直方图计数超过或接近这个百分比对应的象素数…..,文字描述太拗口了,程序其实很简单,有兴趣自己看。
没用一种方法是真正完美的,这问题已经有几万篇论文灌过水了,每年还在以几千篇的速度增加,研究得太细没什么意义,实际应用时,去调程序不如调一下照明光线!

出0入0汤圆

 楼主| 发表于 2012-10-10 16:07:59 | 显示全部楼层

图片没贴上

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-14 16:50:08 | 显示全部楼层
本帖最后由 3050311118 于 2012-10-14 16:51 编辑

楼主找到一个USB CLASS video的范例 共享一下
http://code.google.com/p/lxyppc-tetrix/
http://bbs.21ic.com/icview-163992-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-10-14 19:58:41 | 显示全部楼层
3050311118 发表于 2012-10-14 16:50
楼主找到一个USB CLASS video的范例 共享一下
http://code.google.com/p/lxyppc-tetrix/
http://bbs.21ic.c ...

这个例子我开始就研究过呀!USB Video Class实现的程序在这个帖子中:
http://www.amobbs.com/thread-5262477-1-1.html
我在blog写过做UVC的思路:chunxx.21ic.org

出0入0汤圆

发表于 2012-10-14 21:05:49 | 显示全部楼层
楼主厉害!

出0入0汤圆

发表于 2012-10-14 21:12:59 | 显示全部楼层
不错,顶起

出0入0汤圆

 楼主| 发表于 2012-10-15 17:55:35 | 显示全部楼层
UVC摄像头我只是作为一种调试手段,不过很不喜欢这东西,太TMD娇气了,一不小心就搞得Explorer也死掉。
DirectShow这个框架搞得巨复杂,也就巨脆弱。
这两天测试帧差运算,相邻2帧相减,没有好的测试方法,还是通过UVC,接到PC显示,用DirectShow DDK内置的AMCap.exe程序捕捉视频,能捕捉到AVI文件,Capture时显示是正确的,AVI文件播放确巨慢,几十秒的视频在播放器中打开成了几分钟,AMCap的帧率设置不起作用,不知道这么搞它,谁能帮我看一下?
更搞笑的是,这个几十秒的AVI文件6M多,用RAR压缩,只有91K!Microsoft真的Out了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-10-16 16:31:05 | 显示全部楼层
两帧相减就一个函数,无处可折腾,郁闷。

uint16_t IMA_FrameDelta(uint16 width, uint16 height, uint8 offset)
{
    int32 x, y;
    int16 tmp1;        
    uint16 tmp2, prev_frame, near_frame;
    volatile uint16_t *img_ptr;
    uint16 *buf;
    uint32 ticks;

    ticks = SysTickTime;                        //for debug       
    near_frame = PLD_LockImageFrame(1);
    prev_frame = Pld_SweepPage(near_frame);
    buf = (uint16 *)g_IMG_RowBuffer;       

    for(y=0; y<height; y++)
    {
                //从最新帧读取1行放在Buffer中
        Pld_SetFsmcPage(near_frame);
        Pld_SelectImgRow(y);
        img_ptr = (uint16 *)Pld_PixelPtr(0);
        for(x=0; x<width; x++)
        {
            buf[x] = (uint16)(*img_ptr++);                       
        }

        //行Buffer与次新帧的对应行相减,Update到次新帧
     Pld_SetFsmcPage(prev_frame);
        Pld_SelectImgRow(y);
        img_ptr = (uint16 *)Pld_PixelPtr(0);
        for(x=0; x<width; x++)
        {
           //逐点亮度相减,色度丢弃或从单帧中取
        tmp2 = (*img_ptr);
            tmp1 = abs((tmp2 & 0x00ff) - (buf[x] & 0x00ff)) + offset;
            if (tmp1<0)  tmp1 = 0;
            if (tmp1>255)    tmp1 = 255;                //规范化
//            tmp2 = tmp1 | 0x8000;                        //只取亮度
//            tmp2 = (tmp2 & 0xff00)|tmp1;        //色度从次新帧取
            tmp2 = (buf[x] & 0xff00)|tmp1;        //色度从最新帧取
            (*img_ptr++) = tmp2;
        }
    }

    Pld_SetFsmcPage(prev_frame);
    ticks = SysTickTime - ticks;
    printf("\r\nFrame SUB run times:%dms", ticks*5);
       
    return(prev_frame);
}

两幅1280x1024的图这样相减,时间居然要2s! 逐点运算很可怕。

出0入0汤圆

发表于 2012-10-16 16:53:05 | 显示全部楼层
楼主是偶像啊!

出0入0汤圆

发表于 2012-10-18 14:57:01 | 显示全部楼层
楼主在么, 发我个消息。有项目合作。

出0入0汤圆

 楼主| 发表于 2012-10-18 16:31:00 | 显示全部楼层
lvhaian 发表于 2012-10-18 14:57
楼主在么, 发我个消息。有项目合作。

已回消息。

出0入0汤圆

 楼主| 发表于 2012-10-22 14:55:00 | 显示全部楼层
再上源程序
基于色彩的图像分割



成熟的图像算法大多数是基于灰度(or 曰亮度)的,色彩比较难处理。近来基于HSL彩色的方法有点异军突起的架势,似乎是得益于camshift算法的广泛传播。Camshift在目标跟踪上做得很成功,用的就是HSL分量。
作为探索,研究了一下基于HSL色彩的图像分割。连续的图像,那叫视频,要求太高了不敢做。只是试一下在单帧图像内,找出指定颜色对应的块并标注出来,也就是图像分割的范畴。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-10-22 14:59:45 | 显示全部楼层
运行效果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-10-23 14:25:37 | 显示全部楼层
RGB转换成HSL,可以排除亮度的影响,而亮度是与环境光照直接关联的。不过HSL不像RGB/YUV那样是直接来的数据,现实的数据分布规律还要摸索一下才知道。简单的方法,是做HSL的直方图。直方图看到的如下:


上边是HUE色调,下边是饱和度SAT,亮度就不管了。可以看到这个直方图有尖锐的峰,特别是HUE,主要分布在几条线上,对比灰度直方图,这类统计特征的数据应该好处理得多!另外发现,饱和度都处于比较低的区域,这个对阀值选取是有意义的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-23 15:22:26 | 显示全部楼层
楼主厉害

出0入0汤圆

 楼主| 发表于 2012-10-24 10:28:35 | 显示全部楼层
在HSL域,色调HUE是主要的。设定目标特征时,可以从直方图统计上估计出hue,当然更可靠还是弄到PC上算;SAT和LUM给个比较粗糙的值,逐步调整。实验的结果还是很成功的:


这里用的是基于十字模板的快速块匹配分类,太小的目标识别不了,不过速度相当快:1280x1024的图像,整图识别时间在100ms左右,就是作为连续目标跟踪也基本可用;如果加一些ROI区域调整机制,连续图像完全可以处理。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-24 10:45:05 | 显示全部楼层
想问LZ,那个镜头哪有买?CMOS芯片倒是可以买到

出0入0汤圆

 楼主| 发表于 2012-10-24 18:18:48 | 显示全部楼层
liurangzhou 发表于 2012-10-24 10:45
想问LZ,那个镜头哪有买?CMOS芯片倒是可以买到

我用的是普通4mm和8mm镜头,安防用的那种,在安防市场买的,你在淘宝上查“单板镜头”一大堆。单板镜头和镜头座是分开的,PCB上预留镜头座的安装孔就可以了。

出0入0汤圆

 楼主| 发表于 2012-10-27 18:03:31 | 显示全部楼层
小总结:
    整体而言,基于HSL的鲁棒性相当好,不用太折腾就能稳定下来。不过理想和实际总还是有距离,还是存在一些问题:
    亮度的影响还不能完全排除,太亮和太暗易失败;如果目标物表面有反光特征,识别失败概率很高!光线太强,或者主动发光物,CMOS Sensor会饱和,色调丢失,如红色LED图像上大快是纯白;红外线不行,滤光片影响,CMOS Sensor对不同光谱段的敏感的非线性影响不知道。
    从RGB转换到HSL是一种经典的算法,虽然不复杂,不过在单片机上用,如果每个象素都来一下转换,消耗的时间也很可观,只能用快速匹配法。不过摄像头是不能输出HSL值的。现在在肤色识别的研究中,有用YUV域,根据UV分量识别色彩的,这个倒是值得关注,如果用UV识别能像HSL这样方便,可以省很多事。
   拍了一段AVI,懒得传到视频网站上了,divx再压成rar,有兴趣的自己下载打开:



这一个Project封闭,完整程序放在博客上:chunxx.21ic.org

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-27 20:10:12 | 显示全部楼层
楼主太强了,给力!

出0入0汤圆

发表于 2012-10-28 11:45:42 | 显示全部楼层

出0入0汤圆

发表于 2012-10-28 19:31:59 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2012-11-3 10:30:06 | 显示全部楼层
最近搞个摄像头玩玩

出0入0汤圆

发表于 2012-11-3 11:20:29 | 显示全部楼层
wangguanfu 发表于 2012-9-29 10:19
STM32F407xET6+al422(Processed Bayer RAW格式)可以实现VGA分辨率 JPEG压缩,
STM32F103xET6+al422(Proc ...

STM32F103xET6+al422(Processed Bayer RAW格式)为什么不能实现VGA分辨率?哪方面限制了这个功能?

出0入0汤圆

发表于 2012-11-3 11:22:32 | 显示全部楼层
cool                                                                 

出0入0汤圆

发表于 2012-11-3 12:18:05 | 显示全部楼层
本帖最后由 wangguanfu 于 2012-11-3 12:23 编辑
chkchk 发表于 2012-11-3 11:20
STM32F103xET6+al422(Processed Bayer RAW格式)为什么不能实现VGA分辨率?哪方面限制了这个功能? ...

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
STM32F103的RAM太小,输入缓冲需要至少30KB (640*3*16 )!!。输出缓冲起码50KB( 要是想整个JPEG图片数据都缓冲到RAM里 输出缓冲起码需要40K--50KB,若“流水线”模式一边压缩一边输出可起码也要10K以上,才勉强满足)

出0入0汤圆

 楼主| 发表于 2012-11-4 17:20:55 | 显示全部楼层
wangguanfu 发表于 2012-11-3 12:18
--------------------------------------------------------------------------------------------------- ...

算得很合理呀,做DCT输入8行Buffer,4:1:1抽样的话16行,640x3x16。huffman输出倒不一定要那么大,可以把质量压下一些,一般自然图20K左右也不错了。关键还是FIFO,AL422存不下一帧640x480图像,在压缩的时候后续来的数据就丢了。
JPEG这类磨炼了几十年的标准很难做什么提升,不行就只能拉到。不过现在倒是有兴趣研究一下二值图像压缩,非标准的方法,每帧图像压缩到2KByte以下的话,串口传出来就也不怎么费力了,可以传给其他MCU或者PC做应用。

出0入0汤圆

发表于 2012-11-4 17:23:02 | 显示全部楼层
aL422可以缓冲下VGA分辨率的图象

出0入0汤圆

 楼主| 发表于 2012-11-4 17:28:10 | 显示全部楼层
wangguanfu 发表于 2012-11-4 17:23
aL422可以缓冲下VGA分辨率的图象

是。我粗心了,不过得2片并联16Bit,否则是单色。

出0入0汤圆

发表于 2012-11-4 17:35:31 | 显示全部楼层
chunxx 发表于 2012-11-4 17:28
是。我粗心了,不过得2片并联16Bit,否则是单色。

单片呀 单片VGA  不过得小心处理数据

出0入0汤圆

发表于 2012-11-4 17:53:23 | 显示全部楼层
感谢分享           

出0入0汤圆

发表于 2012-11-4 21:52:20 | 显示全部楼层
不错不错。。感谢LZ

出0入0汤圆

发表于 2012-11-4 22:34:50 | 显示全部楼层
学习一下,楼主的摄像头都是CMOS吗?

出0入0汤圆

发表于 2012-11-4 22:55:40 | 显示全部楼层
马克,学习了

出0入0汤圆

 楼主| 发表于 2012-11-5 13:31:25 | 显示全部楼层
wangguanfu 发表于 2012-11-4 17:35
单片呀 单片VGA  不过得小心处理数据

想明白了。用流水线抢时间,是可行的,不过时序要把握得很好,高难度!佩服

出0入0汤圆

发表于 2012-11-5 13:33:20 | 显示全部楼层
好资料 顶

出0入0汤圆

 楼主| 发表于 2012-11-5 13:34:48 | 显示全部楼层
hy2515131 发表于 2012-11-4 22:34
学习一下,楼主的摄像头都是CMOS吗?

CMOS。开始时用OV7670,后来都用MT9M111


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-5 15:01:04 来自手机 | 显示全部楼层
留下脚印,表示赞同

出0入0汤圆

发表于 2012-11-5 15:25:19 | 显示全部楼层
chunxx 发表于 2012-11-5 13:31
想明白了。用流水线抢时间,是可行的,不过时序要把握得很好,高难度!佩服 ...

"用流水线抢时间"是什么意思?
是一边输入一遍输出吗?

出0入0汤圆

 楼主| 发表于 2012-11-5 21:28:10 | 显示全部楼层
chkchk 发表于 2012-11-5 15:25
"用流水线抢时间"是什么意思?
是一边输入一遍输出吗?

是哦。不过我没试过,别问我

出0入0汤圆

发表于 2012-11-6 10:31:30 | 显示全部楼层
chunxx 发表于 2012-11-5 21:28
是哦。不过我没试过,别问我

那这个对MCU的速度要求就有些高了。一般输出VGA的话,是RGB格式呢,还是YUV422格式?

出0入0汤圆

 楼主| 发表于 2012-11-6 11:50:40 | 显示全部楼层
chkchk 发表于 2012-11-6 10:31
那这个对MCU的速度要求就有些高了。一般输出VGA的话,是RGB格式呢,还是YUV422格式? ...

看你做什么用啦,JPEG压缩要YUV输出,显示或者Bitmap存储用RGB

出0入0汤圆

发表于 2012-11-6 12:37:11 | 显示全部楼层
chunxx 发表于 2012-11-6 11:50
看你做什么用啦,JPEG压缩要YUV输出,显示或者Bitmap存储用RGB

如果是YUV422输出,那缓冲器AL422就可以存下整张图片了,是吧。
我对YUV422格式不熟悉,我的理解是一个像素平均占用内存为一个字节,这样对吗?

出0入0汤圆

发表于 2012-11-6 12:42:18 | 显示全部楼层
chunxx 发表于 2012-9-27 11:32
是用了SDRAM。有人支持就多罗唆几句。
用STM32玩摄像头,是从OV7670开始的,用BL422 FIFO的方式基本上没什 ...

楼主用CPLD扩展STM32内存时,CPLD内部构造FIFO了吗?
CPLD读/写SDRAM是 单字节 还是burst ?

出0入0汤圆

 楼主| 发表于 2012-11-6 14:23:25 | 显示全部楼层
chkchk 发表于 2012-11-6 12:37
如果是YUV422输出,那缓冲器AL422就可以存下整张图片了,是吧。
我对YUV422格式不熟悉,我的理解是一个像 ...

不会全部存在里面,边写入边读出,存在里面的是读出比写入慢那一部分,所以要求比较高的技巧。

出0入0汤圆

 楼主| 发表于 2012-11-6 14:27:18 | 显示全部楼层
fishplj2000 发表于 2012-11-6 12:42
楼主用CPLD扩展STM32内存时,CPLD内部构造FIFO了吗?
CPLD读/写SDRAM是 单字节 还是burst ? ...

CPLD的细节不便公开,这类是固化的东西。不过可以告诉你一点经验:SDRAM不难处理,不管是Single还是Burst,难的是fsmc接口。

出0入0汤圆

发表于 2012-11-6 16:11:17 | 显示全部楼层
本帖最后由 fishplj2000 于 2012-11-6 16:12 编辑
chunxx 发表于 2012-11-6 14:27
CPLD的细节不便公开,这类是固化的东西。不过可以告诉你一点经验:SDRAM不难处理,不管是Single还是Burst ...


CPLD做的sdram控制器对我已经不是秘密了
单字节次读写一次要4-8个时钟周期吧,sdram的时钟如果是100M的话,那数据有效带宽基本为12M*16bit了
如果用RGB565格式,800*600分辨率,简单的算,一帧至少为480000*16bit,FPS=20多,
中间还要读写错开,MCU还要发控制指令
我很好奇楼主的数据吞吐率最高可以做到多少?
以前用LM3S做的时候觉得刷新好慢啊

出0入0汤圆

 楼主| 发表于 2012-11-6 16:30:28 | 显示全部楼层
fishplj2000 发表于 2012-11-6 16:11
CPLD做的sdram控制器对我已经不是秘密了
单字节次读写一次要4-8个时钟周期吧,sdram的时钟如果是100M的话 ...

速度不快,我用的是80M Clk,有一半带宽被CMOS Sensor输入数据自动存储占据,不过主要还是受FSMC制约。MCU读写Pixel大致要250ns。STM32的FSMC是一个有争议的东西,性能不像ST说的那么好,我在另一个Case中,用GPIO也能超过FSMC的速度 ,不过FSMC读写不会被中断影响,程序处理可以减少很多麻烦。
其实以前我做过一个EDO DRAM的版本,那个接口要比SDRAM快,而且简单!可惜EDO DRAM退出市场了,不敢再用。

出0入0汤圆

发表于 2012-11-6 23:29:23 | 显示全部楼层
神一样的的贴子,就是人太笨,看不懂,学习一下。感谢楼主这么耐心的分析。

出0入0汤圆

 楼主| 发表于 2012-11-8 10:24:58 | 显示全部楼层
不小心过了100楼,自我庆祝一下。过几天整理激光光点跟踪的工作成果。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 12:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表