Как обнаружить движение человека в РИ - PullRequest
0 голосов
/ 17 мая 2019

У меня есть видео, и я хочу знать, когда человек входит и остается в определенной области видео, затем устанавливает время в видео (время видео), когда он входит, и когда он уходит, чтобы использовать это время позже для нарезки видео.

Я немного знаком с opencv, но в настоящее время не имею опыта с тензорным потоком или керасом.

Это для анализа видео. Я пробовал некоторые вещи, такие как BackgroundSubtractorMOG, использовать другое разрешение и т. Д.

https://s18.directupload.net/images/190517/wym8r59b.png

https://s18.directupload.net/images/190517/pi52vgv7.png

def calc_accum_avg(frame, accumulated_weight):

    global background

    if background is None:
        background = frame.copy().astype("float")
        return None

    cv2.accumulateWeighted(frame, background, accumulated_weight)

def segment(frame, threshold=25):

    global background

    diff = cv2.absdiff(background.astype("uint8"),frame)

    _, thresholded = cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY)

    contours, hierarchy = cv2.findContours(thresholded.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    if len(contours) == 0:
        return None

    else:
        move_segment = max(contours, key = cv2.contourArea)

        return (thresholded, move_segment)


def main():
  video = cv2.VideoCapture("/home/felix/Schreibtisch/OpenCVPython/large_video.mp4")
  video.set(3, 1920)
  video.set(4, 1080)
  length = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
  print(length)
  num_frames = 0

  fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()

  while True:
      ret,frame = video.read()
      fgmask = fgbg.apply(frame)
      if frame is None:
          return
      frame_copy = fgmask.copy()
      #frame2_copy =frame.copy()
      roi_visualiser = frame[roi_visualiser_top:roi_visualiser_bottom,roi_visualiser_right:roi_visualiser_left]
      roi_board = frame[roi_board_top:roi_board_bottom,roi_board_right:roi_board_left]
      gray = cv2.cvtColor(roi_visualiser, cv2.COLOR_BGR2GRAY)
      gray = cv2.GaussianBlur(gray, (9,9), 0)
      #gray = cv2.cvtColor(roi_board, cv2.COLOR_BGR2GRAY)
      #gray = cv2.GaussianBlur(gray, (9,9), 0)
      if num_frames < 2:
          calc_accum_avg(gray, accumulated_weight)
          #calc_accum_avg(gray2, accumulated_weight)
          if num_frames <= 1:
              cv2.imshow("Finger Count", frame_copy)

      else:
          hand = segment(gray)
          if hand is not None:
              thresholded, move_segment = hand
              cv2.drawContours(frame_copy, [move_segment + (roi_visualiser_right, roi_visualiser_top)], -1, (255,0,0), 1)
              #cv2.drawContours(frame_copy2, [move_segment + (roi_board_right, roi_board_top)], -1, (255,0,0), 1)
              fingers = count_moves(thresholded, move_segment)
              if fingers > 0:
                  print("ja") #test funktioniert
              else:
                  print("Nein")
              cv2.putText(frame_copy, str(fingers), (70,45), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2) #no need
              cv2.imshow("Thresholded", thresholded) #no need
      cv2.rectangle(frame_copy, (roi_visualiser_left, roi_visualiser_top), (roi_visualiser_right, roi_visualiser_bottom), (255,0,0), 1)
      cv2.rectangle(frame_copy, (roi_board_left, roi_board_top), (roi_board_right, roi_board_bottom), (255,0,0), 1)
      num_frames += 1

      cv2.imshow("Finger Count", frame_copy)

I get no error messages all runs fine, but i dont get the correct result i need.


  [1]: https://i.stack.imgur.com/dQbQi.png
  [2]: https://i.stack.imgur.com/MqOAc.png

1 Ответ

0 голосов
/ 18 мая 2019

Вы пробовали BackgroundSubtractorMOG2 ?Он может различать тени, вы можете использовать это для предотвращения ложных срабатываний.
Чтобы сделать обработку более эффективной, сначала создайте подизображение области, куда человек входит / уходит.Примените фоновое вычитание к изображению.Кроме того, если кадры шумят, применение размытия до вычитания фона может улучшить результат.

Проверьте полученную маску на наличие белых объектов значительного размера.Если обнаружено, сохраните номер кадра с помощью video.get(CV_CAP_PROP_POS_FRAMES) в массиве и остановите запись номеров кадров, пока маска снова не станет полностью черной.

...