Python-OpenCV 处理视频(五): 运动方向判断

在检测出运动的物体之后,我还需要知道运动的方向,使用了上一节中的办法检测运动我发现很难去计算运动方向,开始考虑通过计算轮廓的中点的变化来实现,但是因为每次检测出得轮廓的数量不稳定,所以这个办法会让误差不可控。

这时我发现了goodFeaturesToTrack函数,简直是救了我,goodFeaturesToTrack函数可以获取图像中的最大特征值的角点,以下是我的思路:

  • 对两帧图像做一个absdiff得到新图像。

  • 对新图像做灰度和二值化处理。

  • 使用goodFeaturesToTrack函数得到最大特征值的角点。

  • 计算角点的平均点,扔进队列。

  • 维护一个长度为10的队列,队列满时计算队列中数据的增减情况,来确定运动方向。

以下是代码示例:

#!usr/bin/env python
#coding=utf-8

import cv2
import numpy as np
import Queue

camera = cv2.VideoCapture(0)
width = int(camera.get(3))
height = int(camera.get(4))

firstFrame = None
lastDec = None
firstThresh = None

feature_params = dict( maxCorners = 100,
                       qualityLevel = 0.3,
                       minDistance = 7,
                       blockSize = 7 )

# Parameters for lucas kanade optical flow
lk_params = dict( winSize  = (15,15),
                  maxLevel = 2,
                  criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

color = np.random.randint(0,255,(100,3))
num = 0

q_x = Queue.Queue(maxsize = 10)
q_y = Queue.Queue(maxsize = 10)

while True:
  (grabbed, frame) = camera.read()
  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  gray = cv2.GaussianBlur(gray, (21, 21), 0)

  if firstFrame is None:
    firstFrame = gray
    continue

  frameDelta = cv2.absdiff(firstFrame, gray)
  thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]
  # 下面的是几种不同的二值化的方法,感觉对我来说效果都差不多
  # thresh = cv2.adaptiveThreshold(frameDelta,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            # cv2.THRESH_BINARY,11,2)
  # thresh = cv2.adaptiveThreshold(frameDelta,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
  #           cv2.THRESH_BINARY,11,2)
  thresh = cv2.dilate(thresh, None, iterations=2)
  p0 = cv2.goodFeaturesToTrack(thresh, mask = None, **feature_params)
  if p0 is not None:
    x_sum = 0
    y_sum = 0
    for i, old in enumerate(p0):
      x, y = old.ravel()
      x_sum += x
      y_sum += y
    x_avg = x_sum / len(p0)
    y_avg = y_sum / len(p0)
    
    if q_x.full():
      # print list(q_x.queue)
      qx_list = list(q_x.queue)
      key = 0
      diffx_sum = 0
      for item_x in qx_list:
        key +=1
        if key < 10:
          diff_x = item_x - qx_list[key]
          diffx_sum += diff_x
          # print diff_x
      if diffx_sum < 0 and x_avg < 500:
        # print "some coming form left"
        cv2.putText(frame, "some coming form left", (100,100), 0, 0.5, (0,0,255),2)
      else:
        print "right"

      print x_avg
      q_x.get()
    q_x.put(x_avg)
    cv2.putText(frame, str(x_avg), (300,100), 0, 0.5, (0,0,255),2)
    frame = cv2.circle(frame,(int(x_avg),int(y_avg)),5,color[i].tolist(),-1)
  
  cv2.imshow("Security Feed", frame)
  firstFrame = gray.copy()

camera.release()
cv2.destroyAllWindows()

总的来讲作为一个图像处理的小白,不断地折腾和尝试,终于搞出了自己想要的东西,OpenCV绝对是喜欢折腾的人必要掌握的一个库了,以后肯定还会继续研究这块东西。

Python-opencv是一个使用Python进行图像处理和计算机视觉的库。运动方向判断是指通过分析视频中物体或者人的运动轨迹来判断运动方向运动方向判断可以在很多应用中使用,比如行人检测、车辆跟踪等。 在这个.rar文件中,你可以找到一些使用Python-opencv处理视频运动方向判断的示例代码和一些视频样本。通过运行这些示例代码,你可以学习如何使用Python-opencv来实现运动方向判断的功能。 Python-opencv处理视频的基本步骤包括读取视频、获取每一帧图像、预处理图像、计算运动方向等。首先,使用cv2.VideoCapture函数读取视频文件。然后,使用while循环遍历每一帧图像,并对每一帧进行预处理,比如转换成灰度图像、平滑处理等。接下来,使用cv2.absdiff函数计算当前帧和上一帧之间的差别,通过阈值化处理得到前景图像。然后,可以使用cv2.findContours函数找出前景图像中的轮廓,进一步筛选出运动物体的轮廓。最后,计算轮廓的中心点坐标并与上一帧的中心点坐标进行比较,从而判断运动方向。 通过这些步骤,我们可以实现对视频运动方向判断。当然,这只是一个简单的示例,实际应用中可能需要更复杂的算法和处理步骤。但是通过学习这个.rar文件中的代码和示例,你可以了解到使用Python-opencv处理视频运动方向判断的基本方法,同时也可以根据自己的需求进行修改和扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值