2012-01-30
http://player.youku.com/player.php/sid/XMzQ3MDAxMjQw/v.swf
上位机是采用了AForge.NET Framework-2.2.3和EZ-B SDK Windows v2011.11.09.00的结合。AForge真的很强大,不过没有涉及到控制这块,EZB就有现成的参考,但EZB没有提供核心部分的代码,而它只支持本地摄像头,所以我只能反编译获取需要的代码,移植到AForge的MotionDetectorSample这个例子里面。
工程文件
http://bbs.igee.cn/job.php?action=download&aid=4280
http://download.youkuaiyun.com/detail/channel_z/4074603
大部分代码都是来自网络,欢迎大家使用和修改,有好作品别忘了分享一下哦~
源代码解读
MainForm.cs是主窗口代码,上面有一个videoSourcePlayer来播放视频,初始化的时候默认会创建一个MotionDetector(ColorDetector)和一个MotionProcessing(MotionAreaHighlighting),分别是用来检测运动和显示运动区域的。当打开了摄像头之后,MainForm的videoSourcePlayer_NewFrame方法,就会在每一帧画面到来的时候被调用,这个方法会调用AForge.Vision.Motion.MotionDetector的ProcessFrame方法,然后它再调用刚才创建的ColorDetector和MotionAreaHighlighting。其实这个中间过程我们可以忽略,当我们需要新的处理方法的时候,只需要按一定的标准写MotionDetector和MotionProcessing,然后在MainForm调用就可以。
MotionDetector也很简单,主要就是Process_Frame方法,用来做运动检测,比如对比2个画面,有哪些像素的改变等等。我移植EZB的3个MotionDetector和原来的Detector有一点点不同。由于需要对运动的区域定位,并控制瓦力头部的转动,我写了一个父类Detector.cs,这里我们在ProcessFrame之前,先用DrawQuad方法画几条线,把画面分成9块。在ProcessFrame之后,我们就会得到一个位置,在画面哪一块发现了颜色(运动),然后调用Controller去控制瓦力头部运动。
Controller.cs是控制瓦力运动的,这个文件也要根据你的舵机修改,它会调用Sender去发送指令,这里我们不直接调用SocketSender,因为考虑到我们还有很多方法发送控制指令,比如蓝牙,当我们写了一个新的BluetoothSener后,只需换一个调用就可以了。Controller会在MainForm初始化的时候被创建,但是只有在Sender连接后才会发送指令。
logTimer是每秒10次的定时器,定时去Detector把找到运动区域的信息,还有去Sender把发送的指令显示在MainForm。
至于ZB的3个MotionDetector的原理,我也只是反编译了然后直接拿来用,没有认真研究,大概的原理,其实也是2个画面的像素比较吧。
使用说明
EZB提供了几个功能,分别是Color Tracking, Motion Tracking和Face Detect,我就全部移植过来了。打开程序,选择摄像头或MJPG流,默认模式是Color Tracking,捕捉的是红色,如果找到红色的块就会在右边的日志显示。然后输入socket的IP和Port,点"Connect",就会根据捕捉的结果发送指令。特别指出的是,EZB的效率稍低,视频会有一点延迟,Face Detect更加严重,2秒钟才识别一幅图,但我用EZB的程序又没问题,可能是我的分辨率过高(640x480),EZB的分辨率好像只有160x120!