Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 用Python和OpenCV检测OCR中的字间距_Python 2.7_Opencv - Fatal编程技术网

Python 2.7 用Python和OpenCV检测OCR中的字间距

Python 2.7 用Python和OpenCV检测OCR中的字间距,python-2.7,opencv,Python 2.7,Opencv,我不熟悉Python和OpenCV。我目前正在使用Python和OpenCV进行OCR工作,而没有使用Tesseract。到目前为止,我已经成功地检测到文本(字符和数字),但我遇到了检测单词之间空格的问题。 乙二醇- 如果图像显示“Hello John”,则它会检测到Hello John,但无法检测它们之间的空间,因此我的输出是“HelloJohn”,它们之间没有任何空间。我提取轮廓的代码如下所示(我已导入所有必需的模块,这是提取轮廓的主要模块): 在此基础上,对提取出的轮廓进行分类,包括数字和

我不熟悉Python和OpenCV。我目前正在使用Python和OpenCV进行OCR工作,而没有使用Tesseract。到目前为止,我已经成功地检测到文本(字符和数字),但我遇到了检测单词之间空格的问题。 乙二醇- 如果图像显示“Hello John”,则它会检测到Hello John,但无法检测它们之间的空间,因此我的输出是“HelloJohn”,它们之间没有任何空间。我提取轮廓的代码如下所示(我已导入所有必需的模块,这是提取轮廓的主要模块):

在此基础上,对提取出的轮廓进行分类,包括数字和字符。 请帮我检测他们之间的空间。
提前感谢您,您的回复将非常有用。

因为您没有给出任何示例图像,我只是生成了一个简单的图像来测试:

h, w = 100, 600
img = np.zeros((h, w), dtype=np.uint8)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OCR with OpenCV', (30, h-30), font, 2, 255, 2, cv2.LINE_AA)

正如我在评论中提到的那样,如果你只是简单地修改图像,那么白色区域就会扩大。如果您使用足够大的内核来实现这一点,以便附近的字母可以合并,但足够小以至于单独的单词不能合并,那么您将能够提取每个单词的轮廓,并使用该轮廓一次屏蔽一个单词,以便进行OCR

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
dilated = cv2.dilate(img, kernel)

要单独获得每个单词的掩码,只需找到这些较大斑点的轮廓即可。你也可以对轮廓进行排序;垂直、水平或两者兼有,这样你就能把单词按正确的顺序排列。这里因为我只有一行,所以我将按照
x
方向进行排序:

contours = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[1]
contours = sorted(contours, key=lambda c: min(min(c[:, :, 0])))

for i in range(len(contours)):

    mask = np.zeros((h, w), dtype=np.uint8)

    # i is the contour to draw, -1 means fill the contours
    mask = cv2.drawContours(mask, contours, i, 255, -1)
    masked_img = cv2.bitwise_and(img, img, mask=mask)

    cv2.imshow('Masked single word', masked_img)
    cv2.waitKey()

    # do your OCR here on the masked image


这样,您就有了带有字母的二进制图像。一种方法是增加字母的长度,直到附近的字符合并,但单独的单词不会。然后每个单词都有单独的斑点。这些斑点的轮廓都是单个单词的遮罩,你可以用每个斑点单独遮罩原始图像。只需在单独的单词上进行OCR。非常感谢,你的代码工作了…你从我头上卸下了一个很大的负担,再次感谢:)你能帮我扩展代码吗,如果文本是多行而不是一行,例如,只喜欢这条评论。我建议采取类似于我上面所做的方法。尝试用一个长的水平线扩展内核:
kernel=np.ones((1100),dtype=np.uint8)
并查看您得到的响应。这将为每一行提供一个掩码。只需屏蔽每一行,然后对该行重复上述内容。再次非常感谢您…现在我的项目已完成提交…全部感谢您:)先生,我们正在尝试使用相同的工具扩展货币检测项目。是否可以使用相同的工具进行检测。我曾尝试通过使用内核腐蚀货币来提取边缘,但由于背景原因,我无法检测到与数字eg 100对应的轮廓。你能帮我吗?
contours = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[1]
contours = sorted(contours, key=lambda c: min(min(c[:, :, 0])))

for i in range(len(contours)):

    mask = np.zeros((h, w), dtype=np.uint8)

    # i is the contour to draw, -1 means fill the contours
    mask = cv2.drawContours(mask, contours, i, 255, -1)
    masked_img = cv2.bitwise_and(img, img, mask=mask)

    cv2.imshow('Masked single word', masked_img)
    cv2.waitKey()

    # do your OCR here on the masked image