C 语言实验室 2:OpenCV
本实验会给你一份说明书,它描述了一个程序,你需要运用你在前几章中学到的知识构建这个程序。
这个项目比你之前见识到的项目都要大,所以动手之前请阅读完全部内容,并给自己一点时间。不要担心会被难倒,这里没有新概念,你也可以接着往后读,回过头再来做这个实验。
该去完成任务了,我们不会提供任何代码或答案。
说明书:入侵者检测器
试想一下,当你出门在外,如果你的计算机能帮你看家,还能让你看到小偷的真面目,该是多么神奇的一件事!这不是在做梦,只要计算机有网络摄像头,加上 OpenCV 的神奇力量就能做到!
你将创建:
入侵者检测器
计算机会用网络摄像头持续监测周围环境,当检测到有物体在移动时就会把当前捕捉到的图像保存为文件。如果把这个文件保存在网络驱动器上,或使用 Dropbox 那样的文件同步服务,就能抓他个“正着”。
OpenCV
OpenCV 是一款开源计算机视觉库,可以用它获取摄像头的输入、处理图像、分析实时图像数据,并根据计算机看到的东西判断有没有小偷。最重要的是,这一切都可以通过 C 代码来实现。
你可以在 Windows、Linux 和 Mac 平台上使用 OpenCV,通过以下链接访问 OpenCV 的 wiki 页面:
http://opencv.willowgarage.com/wiki/FullOpenCVWiki
安装 OpenCV
你可以在 Windows、Linux 或 Mac 中安装 OpenCV,下面是安装指南,里面包含了 OpenCV 最新稳定版的下载链接:
http://opencv.willowgarage.com/wiki/InstallGuide
安装完以后,你会在计算机上找到一个叫 samples 的文件夹,打开瞧瞧,里面有一些 OpenCV 的 wiki 链接。为了完成实验,你应该调研一番。
如果想深入了解 OpenCV,我们推荐 Gary Bradski 和 Adrian Kaehler 的《学习 OpenCV》。
代码应完成
你的 C 代码应该完成:
获取输入
你要处理摄像头拍摄的实时数据,因此你要做的第一件事就是捕获这些数据。有个叫
cvCreateCameraCapture(0) 的 OpenCV 函数可以帮到你。它返回一个指向 CvCapture 结构的指针,通过这个指针你就可以访问摄像头设备并获取图像。
计算机有可能找不到摄像头,所以调用函数时别忘了检查错误。如果无法访问摄像头,cvCreateCameraCapture(0) 会返回 NULL 指针。
捕获图像
你可以用 cvQueryFrame() 函数读取摄像头拍到的最新图像。它接收 CvCapture 指针作为参数,返回一个指向最新图像的指针。代码在开始时可能看起来像这样:
只要能肯定这幅图像中有小偷,就可以用下面这行代码把图像保存为文件:
检测入侵者
接下来是代码中最巧妙的部分:如何判断某一帧图像中出现了入侵者。
有一种方法是检测图像的移动量。OpenCV 提供了一些创建 Farneback 光流的函数。光流会比较两幅图像,然后告诉你像素移动了多少距离。
这部分内容需要你自己研究,你有可能会用 cvCalcOpticalFlowFarneback() 来比较两幅连续的图像,并创建光流。所以你需要写一些代码来测量两帧画面之间的移动量。一旦移动量超过了某个阈值,你就知道有个大家伙在摄像头前移动。
也许只要我缓缓缓缓缓地移动,它就发现不了我……
全身而退
当启动程序时,你可不希望摄像头把你走开的这个过程也记录下来,因此需要添加一段延时,好让你有时间离开房间。
可选:显示当前画面
测试期间,我们希望能看到当前程序“看到”的那帧画面,为此我们打开一个窗口,用它显示当前网络摄像头的输出。
只要用以下命令就可以在 OpenCV 中创建窗口:cvNamedWindow("Thief", 1);
在窗口中显示当前图像:cvShowImage("Thief", image);
检测器下线
当计算机能自动拍下那些鬼鬼祟祟的家伙,就说明你的 OpenCV 项目已经完成了。
勇者之路
本书最后会介绍一些高级主题。
在你开始探索 C 语言的高级功能前,请确保你的计算机能够使用这些特性。如果你用的是 Linux 或 Mac,很好,但如果你用的是 Windows,需要先安装 Cygwin。
准备好了的话就翻到下一页,挺胸走进大门……
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论