我们需要建立一个车间模型,我们可以在其中关联像素坐标(x,y) 相机图像到商店的3D空间中的实际对象。相机图像将作为产生这种模型的来源,遭受鱼眼扭曲。因此,直线实际上在相机图像中显示为曲线,并且墙壁看起来彼此不完全相同。
我们将该区域细分为多边形。图像上的每个多边形指的是特定区域,例如架子,显示区域,结账台等。通过映射落在每个多边形中的像素,我们希望将其与属于与该区域对应的架子相关联。
任何想法如何去做?
以下是商店的示例图片,其中标有多个多边形:
修改 我们不打算找出3D坐标,我们只需要知道哪个架子是任何多边形映射到的。因此,如果用户点击多边形,我们可以说他点击了哪个架子。
我们可以管理上面的大型多边形,如图中所示的那些,但远离相机的架子可以小到几个像素,所以我们需要某种概率结果说如果用户点击at(x,y)他试图点击Shelf-A的概率是多少,或者他试图点击Shelf-B的概率是多少等等。
基本上,我们所寻找的是一个概率函数,当在2D图像上点击一个小多边形(或一个像素)时,它会返回点击附近物体的概率。
EDIT2: 从样本图像中不明显的一点是,多边形尺寸可能非常小(小到几个像素),而多边形又可能非常接近。
此外,用例是商店中的顾客从其中一个货架中挑选产品。应用程序用户将单击图像中他认为产品被拾取的点。现在,由于多边形非常小且如此接近,因此用户只能猜测拾取的确切点,因此我们最多只能知道它可能是接近点击点的3-4个多边形中的任何一个。所以问题是如何计算这些3-4多边形的概率?
正如这里所建议的那样,点击距离多边形中心的距离及其面积可能是计算此概率的参数,我想知道是否有算法这样做。
答案 0 :(得分:2)
我们不打算找出3D坐标,我们只需要知道哪个架子是任何多边形映射到的。因此,如果用户点击多边形,我们可以说他点击了哪个架子。
我假设您有从多边形到货架名称的映射。例如,作为对的列表(多边形,货架名称)。如果相机固定且不移动,您可以手动制作一次。那么你的问题只是找到一个点属于哪个多边形。
如果您使用OpenCV,则可以使用其PointPolygonTest
功能。否则你可能自己写一个类似的功能。例如,请参阅Ray casting algorithm。然后查看列表,直到找到该点所在的多边形。
要进一步优化程序,您可以预先计算多边形的范围。范围允许您快速说明多边形内的点何时不,并且仅考虑剩余的多边形。但是由于图像中的多边形很少,我不会打扰。
基本上,我们要寻找的是概率函数,当在2D图像上点击一个小的多边形(或一个像素)时,它会返回点击附近物体的概率。
只需运行一项实验,尝试点击一个突出显示的像素,累积一些运算符实际点击位置的统计信息。一旦你有了这个,就可以很容易地预测出对象点击次数以及他们可能会离开的距离。
如果没有使用完全相同类型的人,相同的使用条件和您将要使用的相同指针设备进行此类实验,您无法确切知道点击次数会有多少。我相信很多人都是狙击手,如果鼠标好,他们可以很好地看到图像。如果他们被迫使用触摸界面或其他指针设备,精度可能会降低。
答案 1 :(得分:0)
很少有评论
仅获取3D坐标并且来自一台相机的图像是不够的,需要其他信息
在不同摄像机的同一场景的两个图像上标记相同的点可以为您提供完整的3D信息(您需要知道每个摄像机相对于彼此的位置)
如果您正在寻找工具,请参阅https://superuser.com/questions/30053/is-there-any-free-open-source-software-that-converts-photos-to-3d-models
修改强>
在更新问题之后,假设已存在一组多边形,并且您想要消除用户错误(或提高精度),您可能会
尝试通过计算距离点击的多边形重量中心的距离来猜测所需的点击多边形
使用视觉提示(闪烁所选多边形并需要第二次点击)
收集有关错误的统计信息以及某些需要验证的多边形
答案 2 :(得分:0)
你想要的是空间填充曲线,例如Z-Curce或Hilbert-Curve。空间填充曲线将平面细分为较小的平铺,并以每个平铺得到新订单的方式将二维的复杂度降低为一维。可能对你的问题感兴趣的是Hilber-Curve不是以二进制顺序遍历平面,而是使用格雷码,这样每个图块与其他图块的1-Bit不同。这样可以轻松判断用户是否已单击此对象。