2016-07-13 93 views
1

ich verwende Python2.7.12 und OpenCV 3.0.0-rc1OpenCV Python: Finden Sie Konturen/Kanten/Rechteck in einem Bild

ich auf einem Texterkennung Projekt arbeite.

Das ist, was ich jetzt habe. Original iamge after findContour, line 34

Wie Sie sehen können, enthält das Bild viele "Boxen", in denen sich der Text befindet.

Mein Ansatz ist es, diese Boxen zu finden, sie in separate Bilder zu schneiden und sie an TesseractOCR zu füttern.

Das Programm behandelt das gesamte Bild als eine Kontur. Wie finde ich den kleineren im Inneren?

Oder, wenn Sie alternativen Ansatz haben, begrüßen

Code:

import cv2 


def threshold(im, method): 
    # make it grayscale 
    im_gray = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY) 

    if method == 'fixed': 
     threshed_im = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY) 

    elif method == 'mean': 
     threshed_im = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 10) 

    elif method == 'gaussian': 
     threshed_im = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 7) 

    else: 
     return None 

    return threshed_im 


image = cv2.imread('demo4.jpg') 

# threshold it 
thresh = threshold(image, 'mean') 

# find contours 
_, cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 

print len(cnts) 

cv2.drawContours(image, cnts, -1, (0, 255, 0), 20) 
cv2.imshow('contours', image) 
cv2.waitKey() 

cv2.drawContours(thresh, cnts, -1, (0, 255, 0), 20) 
cv2.imshow('contours', thresh) 

cv2.waitKey() 

`

Antwort

2

Sie sind nur die äußerste Kontur bekommen, weil Sie cv2.RETR_EXTERNAL angegeben. Um alle Konturen des Bildes, sollten Sie das Verfahren wie folgt aufrufen:

cv2.findContours(thresh.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 

Werfen Sie einen Blick auf OpenCV documentation, um zu sehen, wie die Funktion arbeitet.