代码之家  ›  专栏  ›  技术社区  ›  lucians

OCR:检查字母是否在图像(Opencv、Python、Tesseract)的(字符串)中

  •  5
  • lucians  · 技术社区  · 7 年前

    这是一个非常棘手的问题。

    o1

    这是代码:

    import cv2
    import tesserocr as tr
    from PIL import Image
    import numpy as np
    
    img = cv2.imread('1.png')
    
    idx = 0
    
    # since tesserocr accepts PIL images, converting opencv image to pil
    pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    
    # initialize api
    api = tr.PyTessBaseAPI()
    
    alphabet_min = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
                    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    
    alphabet_max = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
                    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    
    try:
        api.SetImage(pil_img)
        boxes = api.GetComponentImages(tr.RIL.SYMBOL, True)
        text = api.GetUTF8Text()
        print(text)
    
        for (im, box, _, _) in boxes:
            x, y, w, h = box['x'], box['y'], box['w'], box['h']
            #print(box)
    
            #if w < 200:
                #cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1)
    
        for letter in text:
            if letter in alphabet_min:
                cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=-1)
    
        idx += 1
    
    finally:
        api.End()
    
    cv2.imshow('2', img)
    cv2.waitKey(0)
    

    如果你仔细观察,你会发现 print(text) . 这一个打印他在图像中找到的文本。但是,由于这是一个手工制作的文本,它几乎无法恢复:

    Ca) a1 1. s 5305 Fm“. 4 54 0235 166 firm 4 §24630455
    

    但即使是这个输出在某种程度上也可以帮助我。

    在上面的代码中,我创建了一个函数:

    for letter in text:
            if letter in alphabet_min:
                cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=-1) 
    

    应该 打印(文本) alphabet_min 代码中的列表。 但它不想工作。我不知道为什么?

    这样做的目的是:如果你在 打印(文本) 字母表_min 列表,然后将其覆盖在图像中(使用 cv2.rectangle )在图像中使用对应项。

    有什么建议吗?

    源图像如下:

    src

    编辑

    在这种情况下进行打印(True),它显示 6 True . 这意味着它找到了字母。唯一的问题是它没有为它们创建边界框。。

    1 回复  |  直到 7 年前
        1
  •  5
  •   lucians    7 年前

    解决了它。。。

    这是新代码:

    import cv2
    import tesserocr as tr
    from PIL import Image
    import numpy as np
    
    img = cv2.imread('1.png')
    
    idx = 0
    
    # since tesserocr accepts PIL images, converting opencv image to pil
    pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    
    # initialize api
    api = tr.PyTessBaseAPI()
    
    alphabet_min = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
                    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    
    alphabet_max = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
                    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    
    t = 0
    try:
        api.SetImage(pil_img)
        boxes = api.GetComponentImages(tr.RIL.SYMBOL, True)
        text = api.GetUTF8Text()
    
        for (im, box, _, _) in boxes:
            x, y, w, h = box['x'], box['y'], box['w'], box['h']
            cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1)
    
            print(text[t])
    
            for letter in alphabet_min:
                if text[t] in letter:
                    cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=-1)
    
            t += 1
            cv2.imshow('2', img)
            cv2.waitKey(0)
    
    
        idx += 1
    
    
    finally:
        api.End()