还是我的小项目,如果把摄像头的每一帧都送到分类器做推理,实在是没必要,只需要把检测到动作的帧送去做推理就好了。这一步的实现参考的是 Adrian Rosebrock的两篇博文Basic motion detection and tracking with Python and OpenCV和Home surveillance and motion detection with the Raspberry Pi, Python, OpenCV, and Dropbox。进一步,摄像头的画面范围很大,并不需要检测镜头内的所有动作,我的需求中只需要检测画面中特定物体上有动作改变。为达到这个目的,我需要把这个物体所在的部分裁剪下来作为背景,然后检测这个背景上是否有动作。我尝试了两种方案。一个是利用tensorflow的objective detection API,识别并定位出这个特定的物体,然后裁剪。另一个是利用opencv的图像模板匹配函数matchTemplate()。当然还有第三种方案没来得及试,就是利用opencv的DNN模块。
先说第一种方案。首先,要找到objective detection API是如何物体定位的。在demo里,物体定位是调用下面这个函数。
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes)