You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CGPoint坐标系绘制矩形:Vision返回坐标无法生成图形

解决Vision框架检测矩形后坐标无法绘图的问题

这是因为Vision框架返回的坐标是归一化坐标(取值范围0.0到1.0),它们是相对于输入图像/视频帧的尺寸比例,而不是直接可用的屏幕像素坐标。你之前手动写的100、200这类数值是屏幕绝对坐标,所以能正常显示,而0.1、0.8这类比例值换算成像素后太小,自然看不到。

下面是具体的解决步骤和修改后的代码:

关键思路

将归一化坐标转换为屏幕/视图的实际坐标,核心是用比例值乘以目标视图的宽高:

  • 实际X坐标 = 归一化X值 × 视图宽度
  • 实际Y坐标 = 归一化Y值 × 视图高度

如果你的输入图像和显示视图的尺寸比例不一致,后续可能需要额外做缩放适配,但先处理基础的坐标转换就能解决当前看不见的问题。

修改后的代码示例

假设你是在当前控制器的view上绘图,我们可以这样转换坐标:

// 先获取目标视图的实际尺寸
let viewWidth = self.view.bounds.width
let viewHeight = self.view.bounds.height

// 创建贝塞尔路径,使用转换后的实际坐标
let rectangle = UIBezierPath()
rectangle.move(to: CGPoint(x: 0.154599294066429 * viewWidth, y: 0.904223263263702 * viewHeight))
rectangle.addLine(to: CGPoint(x: 0.8810795545578 * viewWidth, y: 0.970198452472687 * viewHeight))
rectangle.addLine(to: CGPoint(x: 0.16680309176445 * viewWidth, y: 0.0157230049371719 * viewHeight))
rectangle.addLine(to: CGPoint(x: 0.878569722175598 * viewWidth, y: 0.128135353326797 * viewHeight))
rectangle.close()

let rec = CAShapeLayer()
rec.path = rectangle.cgPath
rec.fillColor = UIColor.red.cgColor
self.view.layer.addSublayer(rec)

额外说明

如果你的Vision检测是基于某个特定图像(比如相机捕获的帧)而非直接对应屏幕尺寸,那你需要先用该图像的宽高做坐标转换,再根据视图的缩放比例调整,确保坐标匹配显示区域。举个例子:

// 假设image是传入Vision处理的原始图像
let imageWidth = image.size.width
let imageHeight = image.size.height
// 先转换为图像像素坐标
let imagePoint = CGPoint(x: normalizedX * imageWidth, y: normalizedY * imageHeight)
// 再根据视图的缩放比例转换为屏幕坐标(示例,需根据实际布局调整)
let screenPoint = self.view.convert(imagePoint, from: imageView)

这样处理后,你应该就能正常看到Vision检测出的矩形了。

内容的提问来源于stack exchange,提问作者johnDoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:53:41