Как определить угловую скорость по видео? - PullRequest
1 голос
/ 24 мая 2019

Рассмотрим видео с вращающимся колесом, считанное серой шкалой. В этом видео я отметил область интереса:

enter image description here

В рамках ROI я взял порог интенсивности пикселей: каждый пиксель с интенсивностью менее 50 обнуляется до 0, а каждый пиксель с интенсивностью более 50 масштабируется до 255.

Из этой информации я создал .txt-файл с двумя столбцами: один содержит метку времени, а другой - среднее значение интенсивности пикселей в области интереса: здесь

Должно быть возможно определить угловую скорость колеса по этой информации. Но я не уверен, как это сделать. У кого-нибудь есть идея?

Вот что я пробовал до сих пор:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt 


VideoData = pd.read_csv('myData.txt', sep='\t')
VideoPixelMean = VideoData.iloc[:,1].values.tolist()
VideoTimestamp = VideoData.iloc[:,0].values.tolist()

SpokeList = []
for idx,el in enumerate(VideoPixelMean):
    if el >= 150:
        SpokeList.append(idx)
VideoVelocity=[]
VelocityTime = [0]
for idx,el in enumerate(SpokeList):
    if idx == 0:
        VideoVelocity.append(0)
    else:
        framesPassed = SpokeList[idx] - SpokeList[idx-1]
        if framesPassed > 2:
            velocity = 2*np.pi/360 * 72 * 50 * 30/framesPassed #each wheel has 5 spokes (the angle between two spokes is 72°) and a radius of 50mm; fps = 30
        else:
            velocity = 0
        VideoVelocity.append(velocity)
        velocityTime = VideoTimestamp[el]
        VelocityTime.append(velocityTime)  

Я почти уверен, что результат неверный.

1 Ответ

3 голосов
/ 24 мая 2019

Интересная проблема! Поверь мне на слово с солью.

Для нашего стационарного ROI скорость может быть определена следующим образом:

Измерение времени, необходимого для перехода к следующей спице. Для этого вы можете измерить первое вхождение светлого пикселя и следующее вхождение светлого пикселя после обнаружения темного пикселя.

D-L-L-L-L-D-D-D.....D-L-L-L-L
  ^                   ^

Когда вы идентифицируете эти точки, получите разницу во времени в секундах (t), чтобы узнать, сколько времени прошло.

Расстояние, как вы рассчитали:

2π(r)(θ/360)

Вы можете получить перпендикулярную скорость:

v_perp = 2π(r)(θ/360) / t

Теперь вы можете разделить его на r, чтобы получить угловую скорость:

v_angular = 2πθ/360t
spoke_start_time, spoke_end_time = None, None

for idx, pixel in enumerate(VideoPixelMean):
     if pixel > 150 and VideoPixelMean[idx-1] < 150:
            if not spoke_start_time:
                spoke_start_time = VideoTimestamp[idx]
            else:
                spoke_end_time = VideoTimestamp[idx]
                break
     else:
        last_pixel = 0

t = spoke_end_time - spoke_start_time # This should be in seconds

THETA = 72
v_angular = (2 * np.pi * THETA) / (360 * t)
...