【问题标题】:python, opencv: duration of time an object is detected on webcampython,opencv:在网络摄像头上检测到对象的持续时间
【发布时间】:2013-10-24 09:41:40
【问题描述】:

我能够在我的网络摄像头返回的每一帧中跟踪一个对象。我想注意第一次检测到对象的时间以及此后持续检测到它的持续时间。网络摄像头无限期开启,即直到它被用户输入关闭。

由于用于检测对象的代码集位于从 cv2.VideoCapture() 读取下一帧所需的 while 循环内,因此我无法想出一种高效的 Pythonic 方式来执行我想要的操作。

现在我正在为每个帧添加一个带有元组 (timestamp,flag) 的列表。 timestamp 是 python 的 time.time() 的值,flag 是一个布尔值,表示是否检测到对象。然后,我总结了标志为“是”的所有时间戳值。但这并不能完全满足我的需求。你能推荐一个更合适的方法吗?

*我希望 opencv 中有一个通用函数,例如 cv2.detectionDuration() :P

--编辑--

这是一个跟踪正面的代码:

import cv2
import time

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
capture = cv2.VideoCapture(0)
keyPressed = -1
faceFound = []

print 'press esc to quit'

while(keyPressed != 27):
    ret, camImage = capture.read()
    cv2.imshow('camImage', camImage)

    try:
        faceRegion = faceCascade.detectMultiScale(camImage)
        timestamp = time.time()
        flag = 1
        faceFound.append((timestamp,flag)) 
    except TypeError:
        timestamp = time.time()
        flag = 0
        faceFound.append((timestamp,flag))
        print 'check if front face is visible to camera'
        pass

    keyPressed = cv2.waitKey(1)
cv2.destroyAllWindows()

timeDelta = 0
for tup in faceFound:
    if tup[1] == 1:
        timeDelta += tup[0]
print timeDelta

另外,您能否帮我获得一个更好的 timeDelta 格式,以便它可以显示为day:hour:min:sec:microsec。对于我当前的要求,是否有更好的 time.time() 替代方法?

【问题讨论】:

  • (time_first, time_last, got_first) :如果 got_first 为 false 并且检测到人脸,则将 time_first 分配给 now() 并将 got_first 分配给 true,当在循环中,未检测到人脸时,您分配time_last 到 now() 和 got_first 到 false 并进行计算。以同样的方式进行下一个循环。
  • 你的建议可能是我正在寻找的答案,所以请将它们作为答案而不是评论发布。
  • 我找到了python的核心模块:datetime.datetime,它可以帮助我以我想要的方式格式化与时间相关的数据。
  • @samkhan13 如果检测到 2 或 3 张面孔,那么您如何区分每张面孔。您是否分配了任何ID。如何计算每张脸的时间
  • @SAndrew 当len(faceRegion) 大于1 时,计时器会持续到len(faceRegion) 变为零。 try-except 语法可能是一个 if-else 来表示“至少看到了一张脸”。为人脸分配唯一标识符并计算相机看到特定人的时间需要“人脸识别”。

标签: python algorithm opencv coding-style


【解决方案1】:
[time_first, time_last, got_first] 

如果got_first 为假并且检测到人脸,则将time_first 分配给now() 并将got_first 分配给真。

当未检测到人脸时,将time_last 分配给now() 并将got_first 分配给false。

import cv2
import time

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
capture = cv2.VideoCapture(0)
keyPressed = -1
faceFound = []
ts = [0,0,False]

print 'press esc to quit'

while(keyPressed != 27):
    ret, camImage = capture.read()
    cv2.imshow('camImage', camImage)

    try:
        faceRegion = faceCascade.detectMultiScale(camImage)
        if ts[2] == False:
            ts[0] = time.time()
            ts[2] = True
    except TypeError:
        if ts[2] == True:
            ts[1] = time.time()
            ts[2] = False
            faceFound.append([ts[0], ts[1]])
        print 'check if front face is visible to camera'
        pass

    keyPressed = cv2.waitKey(1)
cv2.destroyAllWindows()

for list in faceFound:
    print list[1] - list[0]

虽然我认为您的代码有问题,但没有检测到人脸。 你可以打印faceRegion 看看,它是一个空元组。

【讨论】:

  • 检查您的级联文件是否正在加载。此外,cascade.detectMultiScale(image) 可能非常慢并导致capture.read() 丢帧,因为imageRegion 可能为空。并感谢您的帮助:)
  • 我的意思是faceRegion 在之前的评论中。如果faceRegion 是while 循环的每次迭代中的可变长度列表,我该怎么办? len(faceRegion) 取决于检测到的正面人脸数量,这些正面人脸可以在每一帧中不断变化。有什么建议吗?
【解决方案2】:

您尝试执行的操作称为驻留时间,我们在此期间计算检测到的对象在框架内的时间。为了实现这一点,您需要在推理中进行某种跟踪。基本上,跟踪器将为您检测到的对象分配一个对象 ID,然后该对象 ID 保持不变,直到检测到该对象。根据该对象 ID,您可以启动一个计时器并继续计数,直到检测到该对象。在 opencv 中,您可以使用 CentroidTracking 算法

看看这个视频,这可能会给你一个基本的想法:https://www.youtube.com/watch?v=JbNeFMKXybw&list=PLWw98q-Xe7iH8UHARl8RGk8MRj1raY4Eh&index=7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2011-08-23
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多