opencv - 边界框到底在哪里开始或结束?
问题描述
在 OpenCV 或对象检测模型中,它们将边界框表示为 4 个数字,例如 x、y、宽度、高度或 x1、y1、x2、y2。
这些数字似乎定义不明确,但是当分辨率很大时就可以了。但这让我想到,当图像的分辨率非常低时,例如 8x8,一个像素的错误会导致事情变得非常错误。
所以我想知道,当你说边界框有 x1=0,x2=100 时,究竟是什么意思?
具体来说,我想在理解良好的情况下消除这些混淆:
- 边界框边界是占据第 0 个像素还是围绕第 0 个像素(其边界在 x=-1)?
- 边界框的确切末端在哪里?如果图像的形状=(8,8),末端是7还是8?
- 如果要表示占据整个图像的边界框,它的值应该是多少?
所以我认为正确的问题应该是,我如何直观地考虑边界框,这样它们就不会让我感到困惑?
解决方案
好的。在处理了很多天的边界框之后,我现在对如何考虑边界框坐标有了自己的直觉。
我将坐标分为两类:连续的和离散的。当您尝试在它们之间进行转换时,通常会出现心理问题。
假设图像的宽度=100,高度=100,那么您可以有一个带有 x,y 的连续点,该点可以在 range 中具有任何实数值[0,100]
。
这意味着像 (0,0), (0.5,7.1,39.83,99.9999) 这样的点是有效点。
现在,您可以通过取数字的底数将图像上的连续点转换为离散点。例如 (5.5, 8.9) 被映射到图像上的像素数 (5,8)。了解您不应该使用上限或舍入操作将其转换为离散版本非常重要。假设您有一个连续点 (0.9,0.9),该点位于 (0,0) 像素中,因此它最接近 (0,0) 像素,而不是 (1,1) 像素。
在此基础上,让我们尝试回答我的问题:
所以我想知道,当你说边界框有 x1=0,x2=100 时,究竟是什么意思?
这意味着连续点 1 的 x 值 = 0,连续点 2 的 x 值 = 100。连续点的大小为零。这不是一个像素。
边界框边界是占据第 0 个像素还是围绕第 0 个像素(其边界在 x=-1)?
在连续空间中,边界框边框占用零空间。边界非常纤细。但是当我们想将它绘制到图像上时,边框将具有至少 1 像素厚的大小。所以如果我们有一个连续点 (0,0),它将占据图像的第 0 个像素。但理论上,它代表第 0 个像素的左侧和顶部的细边框。
边界框的确切末端在哪里?如果图像的形状=(8,8),末端是7还是8?
您可以拥有的最大 x,y 值是 7.999...但是当转换为离散版本时,您将剩下 7 代表最后一个像素。
如果要表示占据整个图像的边界框,它的值应该是多少?
由于您拥有的精度,您应该在连续空间而不是离散空间中表示边界框坐标。这意味着最大的边界框从 (0,0) 开始,到 (100,100) 结束。但是如果要绘制这个框,则需要将其转换为离散版本,并在 (0,0) 处绘制边界框,并在 (99,99) 处结束。
推荐阅读
- javascript - reactjs在地图功能内切换启用/禁用按钮
- java - 我在 JavaFX 应用程序中收到 java.lang.reflect.InvocationTargetException 异常,我不知道如何修复它
- typescript - 用 Jest 测试 vue 组件似乎没有使用我的模拟商店吸气剂
- spring-boot - 如何创建可以接受多种不同类型作为 RequestBody 的 Spring Boot 端点?
- azure - 如何使用 Azure DevOps API 将工作项与测试结果相关联?
- localization - abp.io 默认验证错误消息的自定义和本地化
- php - 为什么 Laravel Sanctum 未经身份验证返回?
- python - 合并不同Hz的时间数据帧
- r - 键入使用 paste() 创建的 list()
- javascript - 可以在 vanillaJS 中使用没有 Shadow DOM 的插槽吗?