public static ISeries <IVector <T> > LucasKanade <T>(this ISeries <IMatrix <T> > series) { var dt = series.Dt().Convert(_ => _.Serialize()); var dx = series.Convert(_ => _.Dx().Serialize()); var dy = series.Convert(_ => _.Dy().Serialize()); var xx = dx.Combine(dx, (x0, x1) => x0.PairMul(x1).Sum()); var xy = dx.Combine(dy, (x, y) => x.PairMul(y).Sum()); var yy = dy.Combine(dy, (y0, y1) => y0.PairMul(y1).Sum()); var xt = dx.Combine(dt, (x, t) => x.PairMul(t).Sum()); var yt = dy.Combine(dt, (y, t) => y.PairMul(t).Sum()); var det = Series.Combine(xx, xy, yy, (_0, _1, _2) => (T)((dynamic)_0 * _2 - (dynamic)_1 * _1)); var vx = Series.Combine(xt, yt, xy, yy, (xt_, yt_, xy_, yy_) => (T)((dynamic)xy_ * yt_ - (dynamic)xt_ * yy_)); var vy = Series.Combine(xx, xy, xt, yt, (xx_, xy_, xt_, yt_) => (T)((dynamic)xt_ * xy_ - (dynamic)xx_ * yt_)); return(Series.Multiplex(vx, vy, det)); }