代码应完成

你的C代码应该完成:

获取输入

你要处理摄像头拍摄的实时数据,因此你要做的第一件事就是捕获这些数据。有个叫cvCreateCameraCapture(0)的OpenCV函数可以帮到你。它返回一个指向CvCapture结构的指针,通过这个指针你就可以访问摄像头设备并获取图像。

计算机有可能找不到摄像头,所以调用函数时别忘了检查错误。如果无法访问摄像头,cvCreateCameraCapture(0)会返回NULL指针。

代码应完成 - 图1

捕获图像

你可以用cvQueryFrame()函数读取摄像头拍到的最新图像。它接收CvCapture指针作为参数,返回一个指向最新图像的指针。代码在开始时可能看起来像这样:

代码应完成 - 图2

只要能肯定这幅图像中有小偷,就可以用下面这行代码把图像保存为文件:

代码应完成 - 图3

检测入侵者

代码应完成 - 图4

接下来是代码中最巧妙的部分:如何判断某一帧图像中出现了入侵者。

有一种方法是检测图像的移动量。OpenCV提供了一些创建Farneback光流的函数。光流会比较两幅图像,然后告诉你像素移动了多少距离。

这部分内容需要你自己研究,你有可能会用cvCalcOpticalFlowFarneback()来比较两幅连续的图像,并创建光流。所以你需要写一些代码来测量两帧画面之间的移动量。一旦移动量超过了某个阈值,你就知道有个大家伙在摄像头前移动。

也许只要我缓缓缓缓缓地移动,它就发现不了我……

全身而退

当启动程序时,你可不希望摄像头把你走开的这个过程也记录下来,因此需要添加一段延时,好让你有时间离开房间。

可选:显示当前画面

测试期间,我们希望能看到当前程序“看到”的那帧画面,为此我们打开一个窗口,用它显示当前网络摄像头的输出。

只要用以下命令就可以在OpenCV中创建窗口:

  1. cvNamedWindow("Thief", 1);

在窗口中显示当前图像:

  1. cvShowImage("Thief", image);