使用OpenCV检查物理门是打开还是关闭

时间:2012-07-04 11:05:16

标签: opencv

使用相机我必须检查真正的门是打开还是关闭。这是一个普通的木门(里面没有窗户),你可以在任何房子里找到它。

我想使用OpenCV进行图像识别。因此,我想要识别门的开启和关闭状态。

但我不确定我应该使用哪种算法或检测方法。什么是最好的选择呢?


编辑:

这是门的示例图像。我的想法是只扫描图像的一小部分(上角)并使用当前图像检查“关闭状态”图像。屏幕截图中的小例子也是如此。

enter image description here

2 个答案:

答案 0 :(得分:3)

我已经在opencv上发布了类似的回答: http://answers.opencv.org/question/56779/detect-open-door-with-traincascade/

我的问题是检测到摄像机角度稳定的门状态。

主要想法是使用floodfill算法:

import cv2
from numpy import *

test_imgs = ['night_open.jpg', 'night_closed.jpg', 'day_open.jpg', 'day_closed.jpg']

for imgFile in test_imgs:
    img = cv2.imread(imgFile)
    height, width, channels = img.shape
    mask = zeros((height+2, width+2), uint8)

    #the starting pixel for the floodFill
    start_pixel = (510,110)
    #maximum distance to start pixel:
    diff = (2,2,2)

    retval, rect = cv2.floodFill(img, mask, start_pixel, (0,255,0), diff, diff)

    print retval

    #check the size of the floodfilled area, if its large the door is closed:
    if retval > 10000:
    print imgFile + ": garage door closed"
    else:
    print imgFile + ": garage door open"

    cv2.imwrite(imgFile.replace(".jpg", "") + "_result.jpg", img)

结果非常好:

681
night_open.jpg: garage door open
19802
night_closed.jpg: garage door closed
639
day_open.jpg: garage door open
19847
day_closed.jpg: garage door closed

garage door closed garage door opened

答案 1 :(得分:1)

您可以尝试背景检测算法。这个想法是门状态的改变(打开/关闭)将触发背景的改变。您可以使用此信息进一步对事件进行分类(打开/关闭)。

优点:它可以自动适应光照条件的微小变化,而且不需要校准。

此方法的缺点是其他更改可能会触发事件:走廊走廊,灯打开/关闭等等。

你想检测门的上角并没有那么糟糕。您应手动标记所需区域,然后扫描该矩形以查看木质纹理是否仍然存在。 LBP是一个很好的纹理鉴别器,你可以用它来训练一个分类器来区分木材和非木材。不要忘记将样品放在白天/黑夜/傍晚/日光/烛光下。

最后,一个非常简单但可能有效的方法是屏蔽门上的两个区域:一个是门本身,另一个是木制面罩安装在墙上。然后,算法基于非常简单的度量(平均亮度/颜色/强度/等)来比较这两个区域。如果差异高于合理的阈值,可能是门打开了,你看到的是另一个房间里的东西(墙/窗/地毯)