构建块和隔离字符 OpenCV

Build blocks and isolate characters OpenCV

我一直在寻找这个问题的答案,但找不到任何有用的东西。

我正在尝试用相机读取机器可读区域。我需要从机器可读区域中一个一个地提取字符并提供给 OCR。我尝试对图像进行阈值处理,寻找轮廓,一个一个地提取字符,但是当它在实时相机上时,发现轮廓遗漏了一些字符,我得到的结果并不像我预期的那样。

虽然机​​器可读区域的大小、形式已知,但是否有适当的方法为每个字符构建块并提取它们?

更新代码

rect = []
blur = cv2.medianBlur(roi_gray,3) #roi_gray is aligned horizontally MRZ zone
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2)
_,contours, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse = True)[:90]
minH = 20
minW = 20
for ctr in contours:
    if cv2.contourArea(ctr) < 1000:
        xyc,wh,a = cv2.minAreaRect(ctr)
        w,h = wh
        x,y = xyc
        if h >= minH or w >= minW:
            rect.append(cv2.boundingRect(cv2.approxPolyDP(ctr,3,True)))

rect 包含收集的轮廓,但问题是在阈值处理后,例如字符 N 被分成两个轮廓,或者 findContours 没有找到它,所以最终输出中缺少字母。

视频

我发现视频中似乎作者为每个角色构建了块,但遗憾的是作者没有提供有关方法或代码的任何其他信息。 Video link

对我来说,感兴趣区域的 ID 文本具有宽高比,也许块表示该文本区域。具有纵横比(-+ 错误)可能会删除其他文本区域。在 OpenCV 3 中有一个 detector for text。 而且,我想检测到的区域被跟踪了,至少在视频中看起来是这样。

恕我直言,该应用程序正在执行模糊处理,然后进行二值化处理,然后进行腐蚀膨胀以检测文本行。因此,在绕行校正(或者甚至是一点点透视校正)之后,您可以使用垂直投影检测字符宽度,这样您就可以检测每个字符并将其提供给 OCR。


根据评论,我添加了字符区的信息。我会做一个打开操作来填充字母内的空白,或者连接轮廓。然后,通过简单地垂直求和像素值,您将获得垂直投影。现在你在角色之间有一些最小值。使用这些最小值,您可以通过平均它们之间的距离来获得字符宽度。

您还可以做的不是在每个帧上处理这个宽度,而是获得一个在连续帧中变化不大的宽度。您可以通过对最后 5 帧的宽度进行平均(使用队列)来实现此目的。

尝试一下,然后返回一些结果,这样我们将能够为您提供更多帮助。

还有一个 OpenCV forum,您可能会在那里找到更多信息