构建块并隔离字符OpenCV

时间:2017-02-28 09:05:12

标签: opencv ocr

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

我正在尝试用相机阅读机器可读区域。我需要从机器可读区域逐个提取字符并输入到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

1 个答案:

答案 0 :(得分:1)

对我来说,感兴趣区域的ID文本具有宽高比,也许该块意味着文本区域。具有宽高比( - +错误)可能会删除其他文本区域。在OpenCV 3中有一个detector for text。 更多,我想跟踪检测到的区域,至少在视频中看起来如此。

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

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

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

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

还有一个OpenCV forum,你可能会找到更多的信息