考虑一个已被读入为灰度的旋转轮的视频。在此视频中,我标记了一个感兴趣的区域:
在ROI范围内,我已对像素强度设置了阈值:每个强度小于50的像素都下限为0,每个强度大于50的像素均缩放为255。
根据这些信息,我创建了一个.txt文件,该文件包含两列:一列包含时间戳,另一列包含ROI中像素强度的平均值:here
应该可以从该信息确定车轮的角速度。但是我不确定如何执行此操作。有人有主意吗?
这是我到目前为止尝试过的:
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)
我非常确定结果是否正确。
答案 0 :(得分:3)
有趣的问题!一言以蔽之。
对于我们的固定投资回报率,速度可以通过以下方式确定:
测量到达下一个发言所花费的时间。为此,您可以在遇到暗像素后测量亮像素的第一次出现,然后测量亮像素的下一次出现。
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)