Алгоритм ускорения оптического потока (если применимо) Python OpenCV - PullRequest
0 голосов
/ 08 ноября 2018

Я столкнулся с этой интересной ситуацией ( Ускорение оптического потока (createOptFlow_DualTVL1) ), но это не относится к моим потребностям.Моя общая проблема заключается в том, что я хочу максимально ускорить выполнение следующего кода, если он применим.Имейте в виду, я хочу, чтобы кадры были в оттенках серого и изменили их размер до height = 300, сохраняя соотношение сторон.Кроме того, я хочу сэмплировать 2 кадра в секунду из этого видео, поэтому я предполагаю, что каждое видео будет около 30fps.Наконец, я хочу использовать алгоритм оптического потока TV-L1.Есть ли способ улучшить этот алгоритм, потому что для 1-минутного видео требуется около 3 минут, чтобы оценить оптический поток, который слишком трудоемок для моих нужд.

Заранее спасибо, Эван

import math, imutils, cv2
print ("Entering Optical Flow Module...")
        cap = cv2.VideoCapture(video_path)
        current_framerate = cap.get(5)
        ret, frame1 = cap.read()
        prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
        prvs = imutils.resize(prvs, height = 300)


        all_frames_flow=list()
        while(cap.isOpened()):
            frameId = cap.get(1)
            ret, frame2 = cap.read()
            if ret == True:
                if (frameId % (math.floor(current_framerate)/2)==0): # assume videos are 30 fps and we want only 2 frames per second.
                    next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
                    next = imutils.resize(next, height = 300)
                    optical_flow = cv2.DualTVL1OpticalFlow_create()
                    flow = optical_flow.calc(prvs, next, None)
                    all_frames_flow.append(flow)
                    prvs = next
                else:
                    continue
            else:
                break
        cap.release()

1 Ответ

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

Для версии cv2 "4.1.0":

Код ниже более быстрый, но менее точный согласно объяснению гиперпараметров ниже. Настройте эти параметры, чтобы найти компромисс между скоростью и точностью в соответствии с требованием.

optical_flow= cv2.optflow.DualTVL1OpticalFlow_create(nscales=1,epsilon=0.05,warps=1)
flow = optical_flow.calc(new_prvs, new_nxt, None)
  • int "nscales": Количество шкал, используемых для создания пирамиды изображений.

  • int "деформации": количество деформаций на шкалу. Представляет количество раз, которое I1 (x + u0) и grad (I1 (x + u0)) вычисляются по шкале. Это параметр, который обеспечивает стабильность метода. Это также влияет на время работы, поэтому это компромисс между скоростью и точностью.

  • double epsilon: порог критерия остановки, используемый в числовой схеме, который представляет собой компромисс между точностью и временем работы. Небольшое значение даст более точные решения за счет более медленной сходимости.

другие параметры для настройки можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...