c# - net - Error en las coordenadas devueltas de blob
descargar aforge video (1)
Podrías probar Math.Round antes de lanzar:
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)));
Déjame saber si ayuda.
Estoy tratando de detectar y recortar una foto de una página en blanco, en ubicaciones aleatorias desconocidas usando AForge, siguiendo el artículo Here
He descargado una foto de pasaporte de imágenes de google y pegada en una hoja blanca:
AForge hace el trabajo, sin embargo, hay un pequeño problema que no puedo resolver; Las fotos están siendo recortadas mal.
Aquí es cómo se ve la foto recortada después del procesamiento:
¿Te fijas en los márgenes blancos de la foto? como si la foto estuviera inclinada para dejar espacios en blanco a los lados.
No solo AForge no reconoce el cuadrilátero de esta foto como un rectángulo, sino que también lo recorta mal.
Aquí está mi código que tomé del artículo y lo ajusté para recortarlo:
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 apreciar cualquier entrada que pueda ofrecer en este ...