使用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
相关产品推荐
相关产品推荐

