2017-02-28 26 views
1

我一直在寻找这个问题的答案,但找不到任何有用的东西。构建块和隔离字符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

+1

它会更容易让我们来帮助你,如果你与你的情况至少一个图像为我们提供描述。 – m3h0w

+0

我提供了一个视频链接 – Streem

+0

是的,但这是一个有效的软件。如果您向我们证明了您确实存在问题,那么帮助您会更容易。例如,像阈值和轮廓查找期间的图像。这里最大的敌人是规模和视角的转变 - 视频演示的算法对于较小的角度转换非常稳健。 – m3h0w

回答

1

对于我感兴趣的区域ID文本有纵横比,也许块意味着文本区域。有一个纵横比( - +错误),可能会删除其他文本区域。在OpenCV 3中有一个detector for text。 更多的,我想这个区域是被跟踪的,至少在视频中是如此。

恕我直言,该应用程序正在做一个模糊,然后二值化,然后erode扩张检测文本行。所以,在包裹矫正(或者甚至是一些小的透视矫正)之后,使用垂直投影可以检测字符宽度,因此您可以检测每个字符并将其提供给OCR。


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

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

试试看,并返回一些结果,像这样我们将能够帮助你更多。

有一个OpenCV forum,也有你可能会发现更多的信息

+1

我已经检测到感兴趣的文本提取它,进行透视校正,我得到3个MRZ的文本行,你能解释更多关于垂直投影吗?因为我的主要问题是findContours缺少字母或它们的结构,就像我之前所说的在检测字符N之前所说的那样,两个轮廓。 – Streem