【问题标题】:Python: Detecting large digits in an imagePython:检测图像中的大数字
【发布时间】:2021-03-17 02:41:15
【问题描述】:

我目前正在研究在线纸牌游戏中游戏板的相关方面。我已经走了很远,专门使用 OpenCV 的 SIFT 和 FlannBasedMatcher 来根据他们的作品来识别卡片。 SIFT 可用于识别卡片的成本,但我认为仅使用它来识别数字是低效的。由于数字的性质,Tesseract 似乎不起作用,而 OpenCV 模板匹配由于数字被旋转而不起作用。有什么建议吗?

编辑:添加未处理的图像

编辑 2:我尝试在正确旋转的卡片上使用 pytesseract,但它没有为我的处理提供任何准确的结果。这是回报:

paw PoE O ¢ Mls 操作系统,

a) ae»

对于下图:

【问题讨论】:

  • 我想在不经过所有处理的情况下查看该图像。
  • @ChristophRackwitz 可以理解。我已将未经编辑的图像添加到原始帖子的编辑中。
  • 啊。它们排列成一种扇形。您可以将这些区域扭曲(旋转),使它们更适合 tesseract。
  • @ChristophRackwitz 这非常可行,感谢您的建议。如果您不介意我的提问,您是否看到我应用的处理适当?它不适用于我在另一个编辑中添加的示例,因为我没有使用任何 tesseract 配置。

标签: python opencv tesseract image-recognition sift


【解决方案1】:

您可以使用七个胡不变量矩来识别形状。将形状转换为 7 Hu 矩向量后,您可以使用您选择的方法来比较每个向量之间的距离或相似性,以评估每个数字。您可能需要为每个数字创建自己的基线 Hu 矩表示,并使用它来比较从您处理的图像中提取的每个数字。

您可以在此处找到更多信息: Shape Matching using Hu Moments

def cosine_similarity(a, b):
    return np.dot(a, b)/(np.linalg.norm(a)*np.linalg.norm(b))

file = "QcpmV.png"
image = cv2.imread(file)
# Extract digit 6 from image and calculate Hu-Moments vector
shape_six = image[130:190, 70:120, 0]
six = cv2.HuMoments(cv2.moments(shape_six)).flatten()

# Extract first digit 2 from image and calculate Hu-Moments vector
shape_two = image[80:130, 255:310, 0]
two = cv2.HuMoments(cv2.moments(shape_two)).flatten()

# Extract second digit 2 from image and calculate Hu-Moments vector
shape_two2 = image[45:95, 450:500, 0]
two2 = cv2.HuMoments(cv2.moments(shape_two2)).flatten()

# Euclidean distance between normalized vectors
print(np.linalg.norm((six / two) - np.ones_like(two), np.linalg.norm((two2 / two) - np.ones_like(two)))
# 85.40357529593982 8.24734565595225

# Cosine similarity between normalized vectors
print(cosine_similarity((six / two), two), cosine_similarity((two2 / two), two))
# 0.011080249709150468 0.11637902029940049

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2021-03-12
    • 2014-10-30
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多