c# aforge - Errore nelle coordinate restituite da BLOB




download accord (2)

Sto cercando di rilevare e ritagliare una foto da una pagina vuota, in posizioni casuali sconosciute usando AForge, seguendo l'articolo Here

Ho scaricato una foto del passaporto da google e incollata su un foglio bianco:

AForge ha finito il lavoro, tuttavia, c'è un piccolo problema che non riesco a capire; le foto sono state ritagliate errate.

ecco come la foto ritagliata segue l'elaborazione:

Noti i margini bianchi della foto? come se la foto fosse inclinata per lasciare spazio bianco ai lati.

Non solo AForge non riconosce il quadrilatero di questa foto come un rettangolo, ma lo ritaglia anche.

Ecco il mio codice che ho preso dall'articolo e corretto per il ritaglio:

Bitmap bitmap = AForge.Imaging.Image.Clone(bmp, PixelFormat.Format24bppRgb);
BitmapData bitmapData = bitmap.LockBits(
    new Rectangle(0, 0, bitmap.Width, bitmap.Height),
    ImageLockMode.ReadWrite, bitmap.PixelFormat);
Invert invertFilter = new Invert();
invertFilter.ApplyInPlace(bitmapData);
BlobCounter blobCounter = new BlobCounter();
blobCounter.FilterBlobs = true;
blobCounter.MinHeight = 50;
blobCounter.MinWidth = 50;
blobCounter.MaxHeight = 1500;
blobCounter.MaxWidth = 1500;
blobCounter.ProcessImage(bitmapData);
Blob[] blobs = blobCounter.GetObjectsInformation();
bitmap.UnlockBits(bitmapData);
if (blobs.Length == 1)
{
    List<IntPoint> corners;
    List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[0]);
    SimpleShapeChecker shapeChecker = new SimpleShapeChecker();
    if (shapeChecker.IsConvexPolygon(edgePoints, out corners))
    {
        if (corners.Count == 4)
        {
            int[] sides = new int[4];
            Math.Pow(corners[0].X - corners[1].X, 2);
            sides[0] = (int)Math.Sqrt(Math.Pow(corners[0].X - corners[1].X, 2) + Math.Pow(corners[0].Y - corners[1].Y, 2));
            sides[1] = (int)Math.Sqrt(Math.Pow(corners[2].X - corners[1].X, 2) + Math.Pow(corners[2].Y - corners[1].Y, 2));
            sides[2] = (int)Math.Sqrt(Math.Pow(corners[2].X - corners[3].X, 2) + Math.Pow(corners[2].Y - corners[3].Y, 2));
            sides[3] = (int)Math.Sqrt(Math.Pow(corners[0].X - corners[3].X, 2) + Math.Pow(corners[0].Y - corners[3].Y, 2));
            BaseQuadrilateralTransformationFilter qtb = new QuadrilateralTransformationBilinear(corners, sides.Min(), sides.Max());
            bitmap = qtb.Apply(bitmap);
        }
    }
}
bitmap = invertFilter.Apply(bitmap);

Id apprezzare qualsiasi input che puoi offrire su questo ...


Answers

Potresti provare Math.Round prima del casting:

sides[0] = (int)Math.Round(Math.Sqrt(Math.Pow(corners[0].X - corners[1].X, 2) + Math.Pow(corners[0].Y - corners[1].Y, 2)));
            sides[1] = (int)Math.Round(Math.Sqrt(Math.Pow(corners[2].X - corners[1].X, 2) + Math.Pow(corners[2].Y - corners[1].Y, 2)));
            sides[2] = (int)Math.Round(Math.Sqrt(Math.Pow(corners[2].X - corners[3].X, 2) + Math.Pow(corners[2].Y - corners[3].Y, 2)));
            sides[3] = (int)Math.Round(Math.Sqrt(Math.Pow(corners[0].X - corners[3].X, 2) + Math.Pow(corners[0].Y - corners[3].Y, 2)));

Fatemi sapere se aiuta.


Tutti i delegati di Func hanno almeno un parametro

Non è vero. Prendono tutti almeno un argomento di tipo, ma tale argomento determina il tipo di ritorno.

Quindi Func<T> non accetta parametri e restituisce un valore. Usa Action o Action<T> quando non vuoi restituire un valore.







c# .net aforge