我的目标是检测IP摄像机流上特定区域的移动。我设法编写了工作代码,但这是基于我个人的理解。
UPDATE
这段代码有效,但由于我不太了解直方图,我没有设法直接得到值,但是直方图左侧的一些“黑客”是黑色,右边是白色,{{1给出我想要的结果。我知道这不太正确,但是当有人进入投资回报率时,当没有投资回报率和0.5-2.0的结果时,它给出了4-9的结果。
我的问题是: 有没有其他方法来读取直方图和比较数据,或其他一些方法?阅读文档对我没有帮助。
答案 0 :(得分:4)
检测移动的一种方法是使用cv2.accumulateWeighted保持场景的移动平均值。然后,使用cv2.absdiff将每个新帧与平均值进行比较,以获得指示场景变化的图像。
我在我的a video processing project做了这个。检查文件diffavg1.py
中的主循环,我运行累加器并执行差异。
(该项目的研究是利用多核CPU架构实现实时视频处理,因此后期版本diffavg2.py
,diffavg3.py
和diffavg4.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
摄像机视野中一旦发生移动