【问题标题】:Extract letter from captcha with opencv使用opencv从验证码中提取字母
【发布时间】:2021-08-12 20:05:50
【问题描述】:

我正在尝试从一个特别烦人的验证码中检索字母。

我正在尝试使用 opencv2 来实现,但到目前为止,它并没有给我带来惊人的结果。我可能没有通过正确的操作。

【问题讨论】:

  • 为真正实现目标的验证码干杯。
  • 我认为这种行为是不道德的。试图破坏 CAPTCHA 保护表明对服务器所有者缺乏尊重,无论他们这样做是为了保护他们的带宽还是他们的业务

标签: python opencv captcha text-recognition


【解决方案1】:

使用此代码,您可以获取验证码中的每个字母。

def inverte(imagem, name):
    imagem = (255 - imagem)
    cv2.imwrite(name, imagem)
imagem = cv2.imread(image_file)
inverte(imagem, '2.png')
image_file = '2.png'
image = cv2.imread(image_file)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.copyMakeBorder(image, 20, 20, 20, 20, cv2.BORDER_REPLICATE)
thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
letter_image_regions = []
for contour in contours:
    (x, y, w, h) = cv2.boundingRect(contour)
    if w / h > 1.25:
        half_width = int(w / 2)
        letter_image_regions.append((x, y, half_width, h))
        letter_image_regions.append((x + half_width, y, half_width, h))
    else:
        letter_image_regions.append((x, y, w, h))

letter_image_regions = sorted(letter_image_regions, key=lambda x: x[0])

for letter_bounding_box in letter_image_regions:
    x, y, w, h = letter_bounding_box
    letter_image = image[y - 2:y + h + 2, x - 2:x + w + 2]
    letter_image = resize_to_fit(letter_image, 20, 20)
    letter_image = np.expand_dims(letter_image, axis=2)
    letter_image = np.expand_dims(letter_image, axis=0)




【讨论】:

    【解决方案2】:

    这里是调整大小以适应功能

    import cv2
    import imutils
    
    
    def resize_to_fit(image, width, height):
    
        # grab the dimensions of the image, then initialize
        # the padding values
        (h, w) = image.shape[:2]
    
        # if the width is greater than the height then resize along
        # the width
        if w > h:
            image = imutils.resize(image, width=width)
    
        # otherwise, the height is greater than the width so resize
        # along the height
        else:
            image = imutils.resize(image, height=height)
    
        # determine the padding values for the width and height to
        # obtain the target dimensions
        padW = int((width - image.shape[1]) / 2.0)
        padH = int((height - image.shape[0]) / 2.0)
    
        # pad the image then apply one more resizing to handle any
        # rounding issues
        image = cv2.copyMakeBorder(image, padH, padH, padW, padW,
                                   cv2.BORDER_REPLICATE)
        image = cv2.resize(image, (width, height))
    
        # return the pre-processed image
        return image
    
    

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 2011-06-10
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多