「ストロボモード」というものを今はつくっています。現在、位置と速度のストロボモードを実装しました。こんな感じです:
コードは抜粋ですがこんな感じです:
def getVelocityVector(passedPoints, population=1, numFramesDelay=0): # populationは母集団。すなわち、何フレーム分の位置データを用いて速度を求めるか。 # populationが3の場合はvはPt[-1],Pt[-4]を参照する。 indexPtBegin = -1-numFramesDelay-int(population/2) # ptBegin: 始点 indexPtEnd = -1-numFramesDelay+int(population/2) # ptEnd : 終点 # 追跡開始直後 if len(passedPoints) < population+numFramesDelay - int(population/2)+1 \ or passedPoints[indexPtBegin] is None \ or passedPoints[indexPtEnd] is None: return None else: ptBeginNp = numpy.array(passedPoints[indexPtBegin]) ptEndNp = numpy.array(passedPoints[indexPtEnd] ) # 移動ベクトル Δpt = ptEnd - ptBegin deltaPtNp = ptEndNp - ptBeginNp # 移動してなければNoneを返す notMoved = (deltaPtNp == numpy.array([0,0])) if notMoved.all(): return None # 移動していれば、速度ベクトル = 移動ベクトル / 母数 else: velocityVectorNp = deltaPtNp / float(population) velocityVector = tuple(velocityVectorNp) return velocityVector
# 速度ベクトルを記録する lastVelocityVector = utils.getVelocityVector( self._passedPoints, self._populationVelocity, self._numFramesDelay ) self._velocityVectorsHistory.append(lastVelocityVector) # 速度ベクトルをストロボモードで表示する if self._shouldDrawVelocityVectorsInStrobeMode: for i in range(numPointsVisible - 1): if i % self._numStrobeModeSkips == 0 and \ self._velocityVectorsHistory[i] is not None: utils.cvArrow( frameToDisplay, self._passedPoints[i - self._numFramesDelay], self._velocityVectorsHistory[i], 4, (255,0,0), 5 )
次は加速度ですね。頑張ります。