检测骰子的上侧

tfv*_*tfv 7 python opencv image-processing scikit-image

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

这是一个骰子的例子,随意拍摄自己的照片: 在此输入图像描述

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

下面给出了具有一些结果的示例程序.

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()
Run Code Online (Sandbox Code Playgroud)

一些结果图像: 在此输入图像描述

Adi*_*dib 2

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

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

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

这是一个直观的例子:

在此输入图像描述

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