Opencv python背景减法和运动跟踪

Posted

技术标签:

【中文标题】Opencv python背景减法和运动跟踪【英文标题】:Opencv python background substraction and motion tracking 【发布时间】:2017-04-18 07:43:37 【问题描述】:

我在 google 上阅读了有关 opencv 的信息,并在网上找到了以下示例代码可以使用:

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('vid1.mp4')

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"

它为我提供给它的示例视频生成以下类型的输出:

所以我用这个脚本得到了这样的结果。现在我想弄清楚的是 - 1) 获取视频文件中运动物体的边界矩形 2)将该边界矩形的内容从原始视频帧复制到另一个并将完成的视频写入文件

此外,在下面尝试 Kanishak Katahra 解决方案的屏幕截图我在下面屏幕截图右侧的结果窗口中得到以下输出 -

【问题讨论】:

能否将您的问题减少到最小的主题?您是否在问如何使用 OpenCV 写入电影文件?您是否在问如何使用 OpenCV 写入新窗口?您是在问如何将diffImg 保存到变量中以完成这些事情中的任何一个吗?最后,您能否编辑您的问题以包含指向您用于编写此脚本的资源的链接? 我想从 diffimg 中剪切高亮部分,只将 diffimg 中高亮部分从原始帧复制到视频文件中 那么您尝试过什么来实现这一点?当您查看diffImg 的结果时,您能看到它是如何输入到视频文件中的吗? 【参考方案1】:

在你得到的输出中将兴趣点设为 1。其余为0。 将其转换为与原始图像大小相同的 3D 数组。 将原始图像与您得到的输出相乘。

import cv2
import numpy as np
from numpy import newaxis
import time

def diffimg (a,b,c):
    t0 = cv2.absdiff(a,b)
    t1 = cv2.absdiff(b,c)
    t3 = cv2.bitwise_and(t0,t1)
    return t3

cap = cv2.VideoCapture(0)
t = cap.read() [1] 
tp = cap.read() [1]
tpp = cap.read() [1]

t = cv2.cvtColor(t,cv2.COLOR_BGR2GRAY)
tp = cv2.cvtColor(tp,cv2.COLOR_BGR2GRAY)
tpp = cv2.cvtColor(tpp,cv2.COLOR_BGR2GRAY)


while True:

    img = diffimg(t,tp,tpp)
    cv2.imshow("motion detct",img)

    key = cv2.waitKey(10)


    res,img2 = cap.read()
    #print img2.shape

    t = tp
    tp = tpp
    tpp = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

    cv2.imshow('image',img)
    print img
    img[img <= 10] = 0    #Try adjusting this value for better results.
    img[img !=  0] = 1
    img = np.repeat(img[:, :, np.newaxis], 3, axis=2)
    img3 = np.multiply( img,img2)
    cv2.imshow('result',img3)



    if key == 27:   
        cv2.destroyAllWindows()
        break;



print "Goodbye User"

【讨论】:

您好,用您的代码的结果截图更新问题。我想要做的是在结果窗口中抓取从图像窗口可见的区域,以便它现在在结果窗口中带有所有颜色和内部细节它只显示像素化边界我认为移动对象 它为您提供已更改的像素。当您将单色对象移动一小段距离时,不会有多少像素发生变化。这就是为什么你会得到这种输出。用更小、更彩色的对象尝试相同的代码以获得更好的结果。 为了更清楚地理解,在 res,img2 = cap.read() 之前包含 0.5 秒的延迟。

以上是关于Opencv python背景减法和运动跟踪的主要内容,如果未能解决你的问题,请参考以下文章

如何在openCV python中将背景减法与密集光流跟踪相结合

opencv python中的运动跟踪

opencv运动车里检测跟踪轨迹不对

现在想用OPENCV作运动目标的识别和跟踪,用啥方法最好,最快入门?

运动目标检测——光流法与opencv代码实现

运动目标检测--改进的背景减法