博客首页 | 排行榜 |

obelisk的博客

个人档案
博文分类
明天又有嵌入式系统课,今天晚上写下项目进度  2007-11-29 23:14

经过上周五晚上和周六一天的调试,我们的项目组进度目前应该已经领先其他几个小组了吧。按赵老师的要求,今晚把前面所做的所有工作做个小结。

 

2007.10.12 实现PC上的人脸检测:图片,视频,摄像头功能

 

    我们花了几天时间对人脸检测算法有了一个大概的了解,最终选择了opencv的人脸检测代码作为本项目的原始代码。一是因为opencv网站虽仍在建设中,但内容已经比较完整了,绝大部分函数都有较为系统的,中文的说明。二是opencv网站上的代码有在ppc上调试通过的先例,作为一个课程设计,我们也希望能在百般努力而无所获的时候与有经验的人交流。

 

    通过一晚上的调试,我们将opencv网站上的代码在机器上安装并运行通过。opencv提供了很多有关计算机视觉方面的函数及各种小的应用程序。我们初步摸清了其中的人脸检测程序的具体流程,然后在MSVC6.0中定制了一个简单的MFC程序界面,并顺利的将人脸检测程序的各功能函数移植到MFC程序中。利用该MFC程序,可以实现对大部分图片格式的人脸检测,可以检测视频流中的人脸(只能是avi文件,检测率和误检率都不太理想,anyway,这是算法的问题),也可以检测摄像头中的人脸(挺慢)。


2007.10.15 创建openhard上的项目组

 

    按赵老师的要求,我们在openhard上建立一个人脸识别的团队和一个人脸识别的项目。不过openhard的项目管理功能好像不够强大,至少其版本管理只支持赵老师所谓的“手工作坊方式”——上传rar压缩包。我们又在googlecode.com上建了一个人脸检测的project。googlecode.com使用svn进行版本管理,这比openhard方便多了。


2007.11.8  去掉opencv的lib文件,用其提供的cpp文件编译通过人脸检测程序

 

    这一步的工作比较简单。之前我们的MFC程序是在装好opencv的计算机上运行的,需要使用到opencv的库文件,这些库文件都是在opencv的安装过程中设置好了各种环境变量的。离开opencv,人脸检测的程序便不能运行。我们尝试将所有的opencv代码添加至MFC工程中,进行编译,以取消程序对opencv库文件的依赖。

 

    编译成功后,我们决定对代码进行一些裁减。opencv实现的不光是人脸识别,还有其他的一些功能。通过对人脸检测代码的分析,我们发现其只使用到了opencv的三个库:cv库、cxcore库和highgui库。其中cxcore是核心部件,主要进行各种数学运算。cv库,顾名思义,应该是计算机视觉(computer vision),它实现了包括图像处理、结构分析、运动分析与对象跟踪、模式识别、照相机定标和三维重建等功能

。我们去掉了其中一些未使用到的cpp文件。最后,highgui库负责各种格式图像的读入,以及视频流的处理,我们同样去掉了一些其中未使用到的cpp文件。要注意的是程序的视频输出使用了微软的directx,因此在工程的库文件中应包含comctl32.lib和vfw32.lib这两个文件,一般装了directx的机器都会有的。

 

    编译成功,现在可以在未安装opencv的机器上运行人脸检测程序了。

 

2007.11.16 将裁减过的opencv代码在SDK上编译通过

 

    在这之前的几次嵌入式系统实验让我们简单了解了一下开发环境:Xilinx XPS + SDK。两者的功能都非常强大,但是软件的过于庞大让我们很难掌握。这时候我们失去了项目继续前进的方向,因为下一步的工作是要把程序移植到virtex板上运行,而庞大的程序(600k),繁多的源文件(90多个cpp文件和头文件),复杂的文件依赖关系在编译时将遇到的问题将是难以想象的。

 

    赵老师考虑到这点后给了我们一个精简版的程序。据说只能检测单个图像文件中的人脸,但它也把程序复杂性降到了最小(共27个cpp文件和头文件)。我们将该程序拿到SDK中编译,出现了三类主要错误。一是long long类型编译器似乎不支持,改成long后解决;二是包含的头文件找不到,我们发现编译器似乎无法处理嵌套的头文件包含关系,改成包含所有头文件后解决;三是某些空函数未定义,将空函数删除后解决。

 

    晚上我们还尝试了一下将程序下载到virtex板上运行,结果发现每次下载后运行,程序的pc指针都会跳到莫名其妙的地址,带着这个疑惑,我们进入了下一阶段——在virtex板上运行人脸检测程序。
   

2007.11.24 尝试在virtex板上运行人脸检测程序,解决了几个移植过程中出现的问题,但程序无法识别我们给出的图像和cascade文件

 

    充满成就感和挫折感的一天!由于对我们的项目进度不满意,赵老师把板子借给我们一天,并要求我们要在这天将程序跑通。星期五晚上,我们总是在同一个地方碰壁:pc指针跑飞。没有任何进展,还是已经接近了成功的边缘?

 

    星期六上午,在英明神武的组长领导下,我们终于找出了问题所在:前面程序在SDK上编译的时候没有指定程序运行时的内存地址,因此各种地址都是从0x00000000开始的,而我们直接把编译后生成的elf文件拿去跑了。换言之,我们没有意识到link script的作用。在重新定义了程序的起始内存地址后,程序终于能够正常运行了!

 

    星期六下午,我们又遇到了新的问题。程序的正确性需要测试,然而如何生成测试文件却是一个问题。由于代码已经被修改得残缺不全,从代码推测其所需的输入文件格式变得十分困难。通过跟踪调试,我们自己生成了图像和cascade文件,但是将其下载至内存后程序却无法检测。怀疑是图像和cascade文件的格式不对,有待进一步的工作。

   
    以上就是我们项目组到今晚为止的项目进度,应该还是蛮领先的吧,呵呵。今天又收到了赵老师的原始图像文件,下一步的目标也非常明确了,弄清文件的格式,争取做第一个在virtex板上跑通人脸检测程序的小组!

 

|
上一篇:硬件调试 | 下一篇:关于版本管理
以下网友评论只代表其个人观点,不代表本网站的观点或立场