检测骰子的上边

Detecting the upper side of a dice

是否可以检测骰子的正面?如果从顶部看,这将是一件容易的事,但从许多角度来看,可以看到多个侧面。

下面是一个骰子的例子,大家可以自己拍照:

您通常想知道自己取得的分数。我很容易提取所有点,但是如何只提取顶部的点呢?在这种特殊情况下,顶部是最大的,但这可能并不总是正确的。我正在寻找评估顶部正方形(在本例中为圆形,我可以提取)相对于底部网格给出的视角的变形的东西。

下面给出了带有一些结果的示例程序。

import numpy as np
import cv2

img = cv2.imread('dice.jpg')


# Colour range to be extracted
lower_blue = np.array([0,0,0])
upper_blue = np.array([24,24,24])

# Threshold the BGR image 
dots = cv2.inRange(img, lower_blue, upper_blue)

# Colour range to be extracted
lower_blue = np.array([0,0,0])
upper_blue = np.array([226,122,154])

# Threshold the BGR image 
upper_side_shape = cv2.inRange(img, lower_blue, upper_blue)

cv2.imshow('Upper side shape',upper_side_shape)
cv2.imshow('Dots',dots)

cv2.waitKey(0)
cv2.destroyAllWindows()

一些生成的图像:

最好的解决方案是点大小,我在评论中提到过。您找到最大的点,将其视为最大值,然后创建一个公差级别。

但是,如果所有的点都几乎相等(从使物体等距的角度从边缘观察),或者甚至太小怎么办?最好的解决方案是创建一个边界来捕获点。这需要分析骰子的边缘(基本上是边缘检测),但是一旦你定义了边界,你就很可靠了。

您只需要从您所看到的角度捕捉骰子的边缘即可。

这是一个视觉示例:

由于您设置了虚拟边界,因此您只需测量 y 轴上特定点上方的点即可。

点大小是一个很好的启发式方法,但我还要加上点圆度:如果计算二值化点的二阶 image moments,则 x 和 y 矩越相似,则越多圆图。这当然会失败,就像尺寸一样,对于侧视图,但是如果你不能感觉到重力,"top-side" 真正意味着什么..

为什么要尝试截断图像?根据您在侧面看到的数字,您可以推断出顶部的数字。您的边号可以用作支票来验证您的猜测。

请注意,您必须注意惯用手(参见:http://mathworld.wolfram.com/Dice.html