如何将商店图像中的二维坐标映射到实际货架上?

5
我们需要建立一个车间模型,能够将相机图像的像素坐标(x,y)与商店3D空间中的实际物体相关联。这些相机图像将作为生成此类模型的来源,但它们受到鱼眼失真的影响。因此,直线在相机图像中实际上呈现为曲线,并且墙壁似乎并不完全呈直角。
我们正在将该区域细分为多边形。图像上的每个多边形都指代特定的区域,例如货架、展示区、结账柜台等。通过映射落在每个多边形内的像素,我们希望将其归属于对应于该区域的货架。
你有任何想法吗?
以下是商店的样本图像,其中标记了一些多边形:
EDIT:我们不打算找出3D坐标,我们只需要知道任何多边形映射到哪个货架。因此,如果用户单击多边形,我们可以说他单击了哪个货架。
我们能够管理上述大多边形的情况,如图像中所示,但相机远离的货架可能只有几个像素大小,因此我们需要某种概率结果,以便在用户单击(x,y)时,可以确定他试图单击Shelf-A的概率或试图单击Shelf-B的概率等。
基本上,我们要找的是一个概率函数,该函数将返回当在2D图像上单击小多边形(或像素)时,单击附近对象的概率。
EDIT2:从样本图像中无法看出的一件事是,多边形的大小可能非常小(只有几个像素),而多边形又可能非常接近。此外,使用情况是商店的顾客从货架上拿起一个产品。应用程序用户将点击图像上的一个点,从中他认为拿起了产品。现在,由于多边形如此之小且如此之近,用户只能猜测拾取点的确切位置,因此我们最多只能知道它可能是靠近点击点的3-4个多边形之一。因此,问题是如何计算这些3-4个多边形在单击时的概率?
正如在这里建议的那样,单击距多边形中心的距离和其面积可能是计算此概率的参数,我想知道是否有算法可以实现这一点。

你想要做什么? - Unreason
你认为当用户需要非常精确地瞄准时,这是一个好的用户体验吗?你能否向用户展示可能的命中列表(也许这就是你想做的)?欧几里得距离 dist = |click - 多边形中心| 可以用于排序,最大距离可作为阈值。 - bjoernz
3个回答

2
我们并不需要知道3D坐标,我们只需要知道任何一个多边形映射到哪个货架上。因此,如果用户点击了一个多边形,我们就可以说他点击了哪个货架。
我假设你已经有了从多边形到货架名称的映射。例如,作为一对对(多边形,货架名称)的列表。如果相机固定且不移动,您可以手工制作它一次。然后,您只需要找出一个点属于哪个多边形即可解决问题。
如果您使用OpenCV,则可以使用其PointPolygonTest函数。否则,您可以自己编写类似的函数。例如,参见光线投射算法。然后浏览列表,直到找到包含该点的多边形。
为了进一步优化程序,您可以预先计算多边形的范围。范围可以让您快速确定点是否绝对不在多边形内,并仅考虑剩余的多边形。但是由于您在图像中只有很少的多边形,我认为不值得麻烦。
基本上,我们要寻找的是一个概率函数,当在2D图像上点击一个小多边形(或像素)时返回附近物体被点击的概率。

只需运行一个实验,尝试单击一个突出显示的像素,累积一些统计数据,了解操作员实际单击的位置。一旦你有了这些数据,就容易预测非物体内单击的数量以及它们可能偏离的距离。

如果没有同样类型的人、相同的使用条件和相同的指针设备进行这样的实验,你无法真正知道单击会偏差多少。我相信如果鼠标好并且他们能够很好地看到图像,许多人都是狙击手点击器。如果他们被迫使用触摸界面或其他指针设备,则精度可能会降低。


谢谢,你的回答的第一部分解决了很多问题。 从示例图像中不明显的一点是,多边形的大小可能非常小(只有几个像素),而且多边形本身可能非常接近。 因此,使用情况是商店里的客户从货架上选取产品。应用程序用户将在图像上单击一个点,以确定他认为产品被拿起的位置。 - stressed_geek
现在,由于多边形很小且非常接近,用户只能猜测取点的确切位置,因此我们最多只知道可能是靠近点击点的3-4个多边形中的任何一个。那么问题在于如何计算这3-4个多边形在点击后的概率? 正如建议的那样,点击点距离多边形中心的距离和其面积可以成为计算这种概率的参数,我想知道是否有相应的算法来实现这一点。 - stressed_geek
对于你回答的第二部分,上述评论澄清了问题。 - stressed_geek
运行一个测试,看操作员的点击有多精确。例如,如果他们有一秒钟的时间来点击,让一个点在屏幕上出现一秒钟,然后让他们点击它。保存相对于显示像素的点击坐标。这样你就会产生分布。但我认为最好的方法是确定性地找到最近的架子。比如计算从点击到活动区域点的最小距离。选择最小最小值的活动区域。还有一件事:如果区域只有几个像素那么逐像素比较可能效果更好。 - sastanin

0

一些评论

编辑
在问题更新后,假设已经存在一组多边形,并且您想要消除用户错误(或提高精度),您可以

  • 尝试通过计算靠近点击的多边形的重心距离来猜测所需的点击多边形

  • 使用视觉提示(闪烁选择的多边形并要求第二次点击)

  • 收集错误统计信息,并对某些多边形进行验证


我们不需要找出3D坐标,我们只需要知道任何多边形映射到哪个货架。因此,如果用户点击了一个多边形,我们可以说他点击了哪个货架。对于像图像中显示的大多边形,我们能够管理上述问题,但是远离相机的货架可能只有几个像素大小,因此我们需要某种概率结果,以便在用户单击x,y时,他试图单击Shelf-A的概率是多少,或者他试图单击Shelf-B的概率是多少。 - stressed_geek
我建议您使用更好的图片进行说明。就我所听到的,您需要将像素映射到对象上。这并不难。另外,不清楚为什么要在实时视频/低质量摄像头上进行此操作。顺便问一下,摄像头是静态的还是移动的? - Unreason
关于概率,您可以简单地使用多边形到分数的距离。也许可以通过大小进行修改(更大的会更容易点击,人们倾向于点击更靠近中心的位置)。也可以使用多边形“中心”的距离。 - Unreason
这是我们拥有的最佳图像质量,您可以在新标签页中打开它以获得更大的视图。该图像来自于固定监控摄像头的视频录制,因此质量较低。基本上,我们正在寻找一个概率函数,该函数将返回在单击2D图像上的小多边形(或像素)时附近对象被点击的概率。 - stressed_geek
我们试图通过多边形到中心的距离和大小来经验性地推导一个函数,但是一直没有得到一致的结果。因此需要一些帮助。 - stressed_geek
视觉提示和验证是可选项吗?您是否有关于错误与多边形的实证数据?我建议您再次编辑问题,并清晰地呈现用例和典型错误(我仍然不明白使用重心距离无法解决的典型问题是什么)。 - Unreason

0
你需要的是一种空间填充曲线,例如Z曲线或希尔伯特曲线。空间填充曲线将平面分成较小的瓷砖,并以每个瓷砖获得新顺序的方式将二维复杂度降为一维。对于你的问题可能感兴趣的是,希尔伯特曲线不是按二进制顺序遍历平面,而是使用灰码,因此每个瓷砖与其他瓷砖相比在1位上不同。这使得很容易判断用户是否点击了这个或那个对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接