public double ModelError(Matrix <double> model, AffineRegionsPair pair)
        {
            AffineRegion baseRegion        = pair.SecondImageRegion;
            Point        transformedRegion = Transform(pair.FirstImageRegion, model);

            return(baseRegion.CalculateDistance(transformedRegion));
        }
        protected override Point Transform(AffineRegion region, Matrix <double> model)
        {
            int x = region.X;
            int y = region.Y;

            Vector <double> baseVector = DenseVector.OfArray(new double[] {
                x,
                y,
                1
            });

            Vector <double> transformedVector = model * baseVector;

            int u = (int)transformedVector[0];
            int v = (int)transformedVector[1];

            return(new Point(u, v));
        }
        private List <AffineRegionsPair> GetPairsOfOneSide(List <AffineRegion> mainRegions, List <AffineRegion> compareToRegions)
        {
            List <AffineRegionsPair> pairsOfMainSide = new List <AffineRegionsPair>();

            foreach (AffineRegion m in mainRegions)
            {
                double       bestSimilarity    = -1; // by definition, cosine similarity varies between -1 and 1
                AffineRegion mostSimilarRegion = null;
                foreach (AffineRegion c in compareToRegions)
                {
                    double similarity = m.Params.GetCosineSimilarity(c.Params);
                    if (similarity > bestSimilarity /*&& similarity > 0.95*/)   // heuristic
                    {
                        bestSimilarity    = similarity;
                        mostSimilarRegion = c;
                    }
                }
                pairsOfMainSide.Add(new AffineRegionsPair(m, mostSimilarRegion, bestSimilarity));
            }

            return(pairsOfMainSide);
        }
 public AffineRegionsPair(AffineRegion firstImageRegion, AffineRegion secondImageRegion, double similarity)
 {
     FirstImageRegion  = firstImageRegion;
     SecondImageRegion = secondImageRegion;
     Similarity        = similarity;
 }
 protected abstract Point Transform(AffineRegion region, Matrix <double> model);