我正在使用 Vision 框架来检测捕获的照片中的矩形文档。检测并绘制文档周围的路径工作正常。然后我想将图像裁剪为仅检测到的文档。我成功裁剪了图像,但坐标似乎没有对齐,裁剪后的图像只是检测到的文档的一部分,其余部分只是文档后面的 table 。我正在使用以下裁剪代码:
private UIImage CropImage(UIImage image, CGRect rect, float scale)
{
var drawRect = new CGRect(rect.X, rect.Y, rect.Size.Width, rect.Size.Height);
using (var cgImage = image.CGImage.WithImageInRect(drawRect))
{
var croppedImage = UIImage.FromImage(cgImage);
return croppedImage;
};
}
使用以下参数:
图像与我成功绘制矩形路径的 UIImage 相同。
矩形是VNRectangleObservation.BoundingBox。这是标准化的,所以我使用 image.size 对其进行缩放。这与我绘制矩形路径时所做的缩放相同。
比例是 1f,但我目前忽略这一点。
裁剪后的图像通常看起来大小合适,但它向上和向左移动,从而切掉了文档的下侧和右侧。任何帮助将不胜感激。
最佳答案
对于发现此问题的其他人来说,问题似乎是 CGImage
裁剪图像时旋转导致 VNRectangleObservation
不再排队。我用了这篇文章,Tracking and Altering Images ,使用 CIFilter
获得可行的解决方案.裁剪代码如下:
var ciFilter = CIFilter.FromName("CIPerspectiveCorrection");
if (ciFilter == null) continue;
var width = inputImage.Extent.Width;
var height = inputImage.Extent.Height;
var topLeft = new CGPoint(observation.TopLeft.X * width, observation.TopLeft.Y * height);
var topRight = new CGPoint(observation.TopRight.X * width, observation.TopRight.Y * height);
var bottomLeft = new CGPoint(observation.BottomLeft.X * width, observation.BottomLeft.Y * height);
var bottomRight = new CGPoint(observation.BottomRight.X * width, observation.BottomRight.Y * height);
ciFilter.SetValueForKey(new CIVector(topLeft), new NSString("inputTopLeft"));
ciFilter.SetValueForKey(new CIVector(topRight), new NSString("inputTopRight"));
ciFilter.SetValueForKey(new CIVector(bottomLeft), new NSString("inputBottomLeft"));
ciFilter.SetValueForKey(new CIVector(bottomRight), new NSString("inputBottomRight"));
var ciImage = inputImage.CreateByApplyingOrientation(CGImagePropertyOrientation.Up);
ciFilter.SetValueForKey(ciImage, CIFilterInputKey.Image);
var outputImage = ciFilter.OutputImage;
var uiImage = new UIImage(outputImage);
imageList.Add(uiImage);
imageList
是 List<UImage>
因为我正在处理多个检测到的矩形。
observation
是 VNRectangleObservation
类型的单个观察值.
关于ios - 使用 VNRectangleObservation 裁剪 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537573/