检测骰子的上侧

时间:2016-04-11 18:53:25

标签: python opencv image-processing scikit-image

是否可以检测到骰子的上侧?如果从顶部看,这将是一项简单的任务,从多个角度来看,可以看到多个方面。

这是一个骰子的例子,随意拍摄自己的照片: enter image description here

您通常想知道您取得的分数。我很容易提取所有点,但如何只提取顶部的那些?在这种特殊情况下,顶部是最大的,但这可能并非总是如此。我正在寻找一些评估顶部正方形(或者在这种情况下是圆形,我可以提取的)与底部网格给出的透视相关的变形。

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

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()

一些结果图像: enter image description here

3 个答案:

答案 0 :(得分:1)

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

但是,如果所有的点几乎相等(从角度看边缘使得物体等距离),甚至是太小,该怎么办?最好的解决方案是创建捕捉点的边界。这需要分析骰子的边缘(基本上是边缘检测),但是一旦定义了边界,就会很稳固。

您需要的只是从您所看到的视角捕捉骰子的边缘。

这是一个直观的例子:

enter image description here

由于您有虚拟边界集,因此您只需测量y轴上特定点上方的点。

答案 1 :(得分:1)

点大小是一个很好的启发式算法,但我还要添加点圆度:如果计算二值化点的二阶image moments,则x和y矩越相似,越圆数字。对于侧视图来说,这当然会失败,就像大小一样,但如果你感觉不到引力,“顶端”的确意味着什么呢。

答案 2 :(得分:0)

为什么要尝试切割图像?根据您在侧面看到的数字,您可以推断出顶部的数字。您的旁边号码可用作检查以验证您的猜测。

请注意,您必须小心谨慎(参见:{{3}})