我想检测和裁剪照片出来的是空白页,在使用AForge未知的随机位置,文章下面这里
我从谷歌图片下载了一张护照照片,然后卡在白纸上:
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);
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何输入......
您可以在投射之前尝试 Math.Round:
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)));
Run Code Online (Sandbox Code Playgroud)
如果有帮助请告诉我。
归档时间: |
|
查看次数: |
478 次 |
最近记录: |