使用opencv在数字和单词周围放置边界框

时间:2019-05-05 19:21:03

标签: python opencv

目前,我正在尝试编写一个程序,该程序可以检测手写数字和诸如log和sin之类的数学单词。但是,目前,在编写程序时,我的程序只能检测到单个符号,因此,即使检测到数字很好,单词也被检测为单独的字母。附件是我当前的代码。

import cv2
import numpy as np
from PIL import Image, ImageOps


img = cv2.imread("example.JPG")

morph = img.copy()

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1))
morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, kernel)
morph = cv2.morphologyEx(morph, cv2.MORPH_OPEN, kernel)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 15))

# take morphological gradient
gradient_image = cv2.morphologyEx(morph, cv2.MORPH_GRADIENT, kernel)

gray = cv2.cvtColor(gradient_image, cv2.COLOR_BGR2GRAY)

#take this out?
img_grey = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)

# blur = cv2.medianBlur(gray,5)

blur = cv2.medianBlur(img_grey,3)


ret, thing = cv2.threshold(blur, 0.0, 255.0, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

img_dilation = cv2.dilate(thing, kernel, iterations=3)

cv2.imwrite("check_equal.jpg", img_dilation)

conturs_lst = cv2.findContours(img_dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]


coor_lst = []
for cnt in conturs_lst:
    x,y,w,h = cv2.boundingRect(cnt)
    if w < 15 or h < 15:
        continue
    coor_lst.append((x,y,w,h))




如何将数字的行为保持不变,但又以某种方式允许程序检测到事物是单词,从而在整个单词周围绘制边界框?

1 个答案:

答案 0 :(得分:1)

您的问题:

  • 当前,您的程序无法识别数字,单词或任何其他内容。它仅检测页面上的轮廓。如果您的脸上有笑脸,它会检测到它。

您的选择是:

  1. 让您的程序了解它实际看到的内容(与每个字母/数字的已知轮廓进行比较,使用机器学习等),然后解析该更高级的信息。确定手写符号的含义是一个典型的机器学习问题,因此超出了简单的SO答案。可以找到有关此资源作为MNIST数据集的解决方案。一个示例是,您将围绕每个轮廓的农作物喂入在MNIST上训练的[插入ML算法],以识别它们。然后,您将基于[插入试探法,可能是间距],使用一些逻辑将符号分组为单词。
  2. 找到一种简单的启发式方法,可以很好地将数字/数字组的轮廓与字母/单词的轮廓分开。这将在非常简单的情况下起作用,您可以手动调整所有内容。更改手写内容,样式或间距,然后消失,但这全取决于您的项目范围

引用: 多年的计算机视觉研究 https://en.wikipedia.org/wiki/MNIST_database#Dataset