如何在opencv中区分两个渐进式图像

时间:2019-03-26 06:32:47

标签: python opencv

我有一个傍晚时间(下午6点至晚上9点)的视频文件。我想检测出行人的移动情况。

在尝试从“ 10分钟”时间帧视频中找出少量图像之间的差异(在任何10分钟视频帧剪辑中有10张等时间隔的图像)时,我正面临以下挑战:

  1. 所有图像都以不同的方式出现(作为“警报”出现),因为一直有一些植物因风而移动。

  2. 所有10张图片都变得不同,这也是因为太阳下山了,因此由于“自然光变化”,这10张图片 即使经过10分钟的帧后图像仍然不同 没有公共/人类运动。

  3. 如何限制我的算法仅关注视频某些区域的运动,而不是全部? (找不到 google上的任何内容,或者不知道在opencv中是否有任何算法)

2 个答案:

答案 0 :(得分:1)

  1. 这个很难处理。我建议您尝试稍微模糊帧以减少移动植物时产生的噪音。另外,如果移动范围不太大,请尝试更改差异阈值和面积阈值(如果您的算法包含轮廓检测,请执行以下步骤)。希望这可以有所帮助。

  2. 对于检测人的“运动”,(10帧/ 10分钟)fps有点太低。框架中的人可以完全不同。这意味着您无法检测到单个人的移动,而只能找到两个帧之间的差异。如果您使用的是低fps的视频,建议您尝试Background Subtraction,以找到帧中的人物,而不是帧之间的人物移动。对于背景减法,要解决

  

所有这10张图像也有所不同,这也是因为太阳下山了,因此,即使没有公共/人类活动,由于10分钟的帧距而产生的10张图像也因自然变化而变化。

您可以尝试将所有帧的平均图像用作background_img中的

difference = current_img - background_img

如果时间跨度较长,则可以将current_img最近的图像的平均值用作background_img。并在运行视频时不断更新background_img

  1. 如果您的投资回报率是框架中的矩形,请使用

    my_ROI = cv :: Rect(x,y,width,height) cv :: Mat ROI_img = frame(my_ROI)

如果没有,请尝试使用mask

答案 1 :(得分:0)

我认为您正在寻找的是行人检测。您可以使用 OpenCV 包在 Python 中轻松完成此操作。

# Initialize a HOG descriptor
hog = cv2.HOGDescriptor()

# Set it for Pedestrian Detection
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

# Then use the detector
hog.detectMultiScale()

例如:Pedestrian Detection OpenCV