检测骰子的上边
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)
是否可以检测骰子的正面?如果从顶部看,这将是一件容易的事,但从许多角度来看,可以看到多个侧面。
下面是一个骰子的例子,大家可以自己拍照:
您通常想知道自己取得的分数。我很容易提取所有点,但是如何只提取顶部的点呢?在这种特殊情况下,顶部是最大的,但这可能并不总是正确的。我正在寻找评估顶部正方形(在本例中为圆形,我可以提取)相对于底部网格给出的视角的变形的东西。
下面给出了带有一些结果的示例程序。
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)