Я пытаюсь обнаружить и вырезать фотографию из пустой страницы в неизвестных местах с использованием AForge, следуя статье здесь
Я загрузил фотографию паспорта с изображений Google и застрял на белом листе:
AForge выполняет свою работу. Однако есть небольшая проблема, которую я не могу понять; фотографии обрезаются неправильно.
вот как обрезанная фотография выглядит после обработки:
Вы заметили белые поля фотографии? как будто фотография наклонена, чтобы оставить пустое пространство по бокам.
Не только AForge не распознает четырехугольник этой фотографии как прямоугольник, но он также наносит вред.
Вот мой код, который я взял из статьи и настроен для обрезки:
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);
Идентификация ценит любой вклад, который вы можете предложить на этом...