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

2024-03-29 07:31:34 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在尝试编写一个程序,可以检测手写数字和数学字,如日志和罪恶。然而,现在我的程序只能检测单个符号,所以当数字被检测到时,单词被检测为单独的字母。附件是我目前的代码。你知道吗

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




如何保持数字的行为相同,但让程序检测到事物是单词,并在整个单词周围绘制边界框?你知道吗


Tags: import程序img数字单词cv2kernellst
1条回答
网友
1楼 · 发布于 2024-03-29 07:31:34

您的问题:

  • 目前你的程序既不能识别数字也不能识别单词。它只检测页面上的轮廓。如果你脸上有笑脸,它会发现的。你知道吗

您可以选择:

  1. 让你的程序理解它实际看到的是什么(与每个字母/数字的已知轮廓进行比较,使用机器学习等),然后解析更高层次的信息。确定一个手写符号的意义是一个典型的机器学习问题,因此不是一个简单的答案。这方面的资源可以作为MNIST数据集的解决方案找到。一个例子是,你将把你的每个轮廓周围的作物喂入一个在MNIST上训练的[insert ML算法],该算法将识别它们。然后,您将使用一些逻辑根据[插入启发式,可能是空格]将符号分组到单词中。你知道吗
  2. 找到一些简单的启发式方法,可以很好地将数字/数字组的轮廓与字母/单词的轮廓分开。这将在非常简单的情况下工作,您可以手动调整所有内容。更改手写体、样式或间距,这一个就会消失,但这一切都取决于您的项目范围

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

相关问题 更多 >