示例#1
0
        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));
        }