测量图像中扑克牌的高度

Measuring height of a playing card deck in an image

我正在为赌场监控软件编写模块。

一些上下文:

我在不同时间从视频中提取了多张图像。我有一个参考平台,它总是位于我知道其大小的固定位置。假设畸变、相机焦距和距离未知(这将是商业销售的软件包,因此这些参数未知)。

目前工作:

我应用了 canny 边缘检测和 houghlines 来获得两副牌的像素高度。前面甲板所有角的坐标也是已知的,因为它始终处于相同方向的固定位置。

当参考甲板与我要测量的甲板的距离不同但离相机更近时,问题就开始了。在这种情况下,由于其中一副牌离相机较近,两副牌可能看起来具有相同的像素高度,尽管后面的那副牌包含更多卡片。

这是一个视觉示例:

实际上,两副牌都有 52 张牌,但靠近相机的那副有 83 像素,而后面那副有 63 像素。

我怎样才能规范化背景中的套牌参考值?我发现了一个问题,当在图像中移动时,它会做一些类似于计算大小的事情,但这使用了我不熟悉的 openGL (How do I reverse-project 2D points into 3D?)。我正在尝试在 Python 中使用计算机 vision/image 操作库(我目前使用 ImageMagick 处理 canny edge 和 hough 线)来实现这一点(如果您认为 python不合适)。

编辑:

总结一下我想要实现的目标:我想知道这两个对象如何比较高度。我如何将后面的那个缩放到它在前面的旁边的大小,以便我可以比较两者?

我不熟悉 ImageMagick,所以无法为您编写代码,但我已经解释了您要做什么:

有一点我们可以确定:每张卡片的真实大小!你知道所有的卡片都有相同的宽度和高度(在现实世界中),所以你唯一需要做的就是找到图像中第一堆和第二堆上面卡片的宽度.由于这两个数字相互关联,现在您可以得到甲板 1 和甲板 2 周围尺寸的比率。

使用这些比率,您可以标准化甲板的高度并将这些数字相互比较。

例如,考虑每张卡片的宽度(红色箭头)为 5 厘米,第一副牌的图像宽度为 80 像素,第二副牌为 40 像素。所以比率是2。现在要比较那些黑线,只需将第二条线的长度乘以2,然后将结果数与第一条线的长度进行比较。

你有很多方法来估计每副卡片组的宽度。提取宽度可能很难,所以我建议比较图案的宽度(黄色箭头),为此,我会采用这样的方法:

1- Do a canny on image (because of the drawings on the card, you will have lots of line on the surface of the card)

2- Do a dilation to stick all those lines of drawing on the surface of the card and make a unit object

3- Do an erosion to shrink that object a little, and then catch the width of that object (this would be a good estimation of the width of the card)

我认为,您应该将参考牌组的面积与目标牌组的面积进行比较。
但首先你应该计算参考甲板和目标甲板的距离。
如果你的数据集有标签或者你的问题是监督的。
我想,如果你使用神经网络,你可以将两副牌的距离设置为偏置值。
另外,我认为,您应该将两副牌的两个最近像素的距离计算为两副牌的距离。