ios - 使用 VNRectangleObservation 裁剪 UIImage

标签 ios xamarin xamarin.ios uiimage

我正在使用 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);

imageListList<UImage>因为我正在处理多个检测到的矩形。

observationVNRectangleObservation 类型的单个观察值.

关于ios - 使用 VNRectangleObservation 裁剪 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537573/

相关文章:

java - 无法在 Android 上的 Xamarin 中使用 PayPal SDK 找到明确的 Activity 类付款 Activity

c# - 在 Xamarin 中获取 OutOfMemoryException

ios - 用于在 Windows 中开发 iOS 应用程序的 Smartface 或 Xamarin

iOS 如何从表格 View 单元格 Swift 中的解析下载图像

.net - 用于 MonoTouch 的 Log4Net

android - 在 MvxLinearLayout 中绑定(bind)到 View 的宽度

ios - 在哪里可以找到使用 Core Animation 和 Monotouch 的一些示例?

ios - Xamarin:无法安装应用程序 AMDeviceSecureInstallApplicationBundle 返回:0xe8008015

ios - Swift - 如何在调用 removeFromSuperview() 后得到通知?

ios - 如何在 iOS 后台保存加速度计数据?