【问题标题】:Error in blob's returned coordinatesblob 的返回坐标错误
【发布时间】:2016-04-28 20:29:16
【问题描述】:

我正在尝试使用 AForge 在未知的随机位置检测和裁剪一张空白页面中的照片,遵循文章 Here

我从谷歌图片中下载了一张护照照片并贴在一张白纸上:

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

感谢您对此提供的任何意见...

【问题讨论】:

  • 我在文档成像中使用的一个技巧是提高“对比度”,这样当您进行去歪斜然后裁剪时,图像几乎是黑色的。你看起来很高级,所以我相信你已经知道了,但没有伤害。
  • 我怀疑整数精度。检查您的警告 - 是否有任何从实数类型到整数的隐式转换?

标签: c# .net aforge


【解决方案1】:

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

如果有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多