OpenCV检测python中的运动

时间:2016-11-09 19:24:35

标签: python opencv motion-detection

我的目标是检测IP摄像机流上特定区域的移动。我设法编写了工作代码,但这是基于我个人的理解。

UPDATE

这段代码有效,但由于我不太了解直方图,我没有设法直接得到值,但是直方图左侧的一些“黑客”是黑色,右边是白色,{{1给出我想要的结果。我知道这不太正确,但是当有人进入投资回报率时,当没有投资回报率和0.5-2.0的结果时,它给出了4-9的结果。

我的问题是: 有没有其他方法来读取直方图和比较数据,或其他一些方法?阅读文档对我没有帮助。

3 个答案:

答案 0 :(得分:4)

检测移动的一种方法是使用cv2.accumulateWeighted保持场景的移动平均值。然后,使用cv2.absdiff将每个新帧与平均值进行比较,以获得指示场景变化的图像。

我在我的a video processing project做了这个。检查文件diffavg1.py中的主循环,我运行累加器并执行差异。

(该项目的研究是利用多核CPU架构实现实时视频处理,因此后期版本diffavg2.pydiffavg3.pydiffavg4.py是逐步提高性能的实现,但是底层的accumulate-diff算法是相同的。)

答案 1 :(得分:2)

差分图像是减去两个图像的结果

因此差分图像显示两个图像之间的差异。使用这些图像,您可以使运动可见。

在下面的脚本中,我们使用从三个连续图像计算的差分图像,和。这样做的好处是从结果中删除了不感兴趣的背景。

  

OpenCV提供了相互减去两个图像的可能性   使用absdiff()。此外,对两个图像的逻辑运算已经完成   实现。我们使用方法bitwise_and()来实现final   差分图像。在python中它看起来像这样:

def diffImg(t0, t1, t2):
  d1 = cv2.absdiff(t2, t1)
  d2 = cv2.absdiff(t1, t0)
  return cv2.bitwise_and(d1, d2)

我们要做的最后一件事是将差分图像功能带入我们之前的脚本中。 在循环开始之前,我们读取前三个图像t_minus,t和t_plus并将它们转换为灰度 图像,因为我们不需要颜色信息。利用这些图像,可以开始计算差分图像。显示差分图像后,我们只需要删除最旧的图像并阅读下一个图像。最终的脚本如下所示:

import cv2

def diffImg(t0, t1, t2):
  d1 = cv2.absdiff(t2, t1)
  d2 = cv2.absdiff(t1, t0)
  return cv2.bitwise_and(d1, d2)

cam = cv2.VideoCapture(0)

winName = "Movement Indicator"
cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE)

# Read three images first:
t_minus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
t = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)

while True:
  cv2.imshow( winName, diffImg(t_minus, t, t_plus) )

  # Read next image
  t_minus = t
  t = t_plus
  t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)

  key = cv2.waitKey(10)
  if key == 27:
    cv2.destroyWindow(winName)
    break

print "Goodbye"

Here you will find more elaborative answer, for what you are looking for.

答案 2 :(得分:0)

可以通过抓取来完成。

安装

pip install ecapture

代码

from ecapture import motion as md

md.motion_detect(0,"x")
print("detected")

此代码将打印

detected

摄像机视野中一旦发生移动