唇形标签贴标机-以编程方式扩大圆柱变形

在我们的应用程序中,有一个功能,例如我母亲的女友 vivino的儿子 -照片中酒的定义。 在后台-使用第三方服务Tineye-确定最合适的标签Google Vision-读取其中的文字。 为了澄清正确的产品,必须使用后者,因为 图片搜索没有考虑到某些地区的重要性,通常是文字信息-葡萄酒的年份和类型。

但是,由于标签被圆柱形表面扭曲,因此两种服务的准确性都会明显降低。

在Google视觉中,这一点尤其明显-标签中心部分以外的任何文本实际上都是不可读的,尽管人们很容易识别。 在本文中,我将介绍如何消除失真并提高产品识别的准确性。



首先,考虑什么是失真。



矩形标签粘贴到圆柱体上时,具有桶形特征形状(上图中的b)。 在这种情况下,ABC曲线近似为椭圆,因为 我们看到一个成一定角度的圆(圆柱截面)。 标签上的许多水平线同样会转换成照片中的许多椭圆。

最有趣的是,要扩展标签,只需指定6个标记(ABCDEF):



并使用它们来构建完整的曲面网格:



有一个表面网格,我们可以分别扩展每个图块,并获得原始表面:



库代码可在github上找到 。 此方法的便利之处在于,用于逆变换的输入参数是标签的直观定义的特征(角度和上,下点),使您可以完全自动化该过程。

下一部分是关于定义标记的。 工作代码仅在github分支中部分可用,因为 黑客和萨满教义涵盖了一个真正可行的解决方案,因此良心根本不允许将此类锡上传到github。

第一阶段-将图像转换为黑白图像。

然后,您需要获取带有标签的瓶子轮廓。 为此,我们使用sobel变换 。 简而言之,此滤镜首先使图像模糊,然后从原始图像中减去它。 结果,即使区域仍然保持黑暗,边缘(变化)仍然保持明亮。



下一步是确定两条最明显的垂直线,如果幸运的话,它们是瓶子的边缘。 在这种情况下,这是正确的,但是如果您在其他瓶子旁边拍摄一个瓶子,则不再是这种情况。

要确定这些线,请使用霍夫变换 。 该技术的本质是我们在整个屏幕上采用许多行,并考虑像素的平均值(例如,我们采用从图片顶部到底部的线)。 我们将这些值转移到新的坐标平面,并得到类似热图的信息。 在此热图中,我们正在寻找两个极值-它们是边线。

下图显示了左线如何到达新坐标平面上的点:



椭圆稍微复杂一点,但是知道霍夫变换可以应用于任何数学定义的曲线,因此我们将再次使用此方法,但是这次我们将查找许多椭圆曲线。

但是首先,您需要将问题转换为二维形式。 知道瓶子是中心对称的,我们以Y坐标为中心轴,以X为边之一。对于新坐标平面上的值,我们在中心轴线和侧面之间取了许多椭圆。 这可能是由于以下事实:侧面和中心轴上的任意点只有一种连接方法。 乍一看,这也许不是很明显,但是如果我们转向椭圆的参数公式,则更容易理解:

x =一个* cos(t)
y = b *罪恶(t)



以完全相同的方式,我们找到了两个定义了两个标签椭圆(曲线AB,FE)的极值。 现在我们有了所有必需的标签参数(侧曲线以及上下椭圆),我们可以从本文的第一部分开始应用算法并执行逆变换。

有什么可以改进的。 首先,该算法未考虑椭圆本身的透视失真,因此,标签的侧面片段被拉伸得比其应有的略多。 要进行校正,您需要知道相机的真实视角,或者至少使用最典型的手机视角(可以凭经验选择)。

其次,霍夫变换在困难的条件下会非常不稳定-例如,当相邻的瓶子掉入框架中,并且可能无法正确检测到目标瓶子的边缘时。

第三,如果标签的形状不是矩形(例如,椭圆形),则标记将被错误地检测到,并且变换只会使图像更强烈地变形。

在实践中,使用神经网络来识别标记会更加有趣,因为 可以使用复杂的示例对其进行训练,这样,如果无法确定标记,则算法至少不会执行转换。 但是到目前为止,我还没有尝试使用神经元来完成这项任务,所以也许这将是另一篇文章的主题:)

Source: https://habr.com/ru/post/zh-CN424151/


All Articles