blob的返回坐标出错

时间:2016-04-28 20:29:16

标签: c# .net aforge

我正在尝试使用AForge在未知的随机位置检测并裁剪出空白页中的照片,并在文章Here

之后

我从谷歌图片下载了一张护照照片,然后卡在白纸上:

enter image description here enter image description here

AForge完成工作, 但是,有一个小问题,我无法弄清楚; 照片裁剪错误。

以下是处理后裁剪照片的外观:

enter image description here

你注意到照片的白边吗?好像照片倾斜,在两侧留下空白区域。

不仅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);

我非常感谢您提供的任何输入...

1 个答案:

答案 0 :(得分:2)

您可以在投射前尝试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)));

让我知道是否有帮助。