2016-05-22 15 views
0

ich derzeit OpenCV in Python lerne, und ich versuche, auf diesem Bild die Kontur des Gitters zu ziehen über das Sudoku-Rätsel zu extrahieren daraus enter image description hereExtrahierung Gitter aus einem Sudoku-Rätsel in Python

Das ist das ist Code schrieb ich für dieses spezifische Problem:

CONST_IMAGE_PATH = "sudoku-original.jpg" 
CONST_COEFF = 0.02 
def main(): 
    originalImage = cv2.imread(CONST_IMAGE_PATH) 
    img = cv2.imread(CONST_IMAGE_PATH,0) 
    img = cv2.medianBlur(img,5) 
    img = cv2.adaptiveThreshold(img , 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2) 
    img = cv2.bitwise_not(img,img) 
    print "thresholding the image" 
    cv2.imshow("Thresholded", img) 
    kernel = np.empty((3,3),'uint8') 
    kernel[0][0] = 0 
    kernel[0][1] = 1 
    kernel[0][2] = 0 
    kernel[1][0] = 1 
    kernel[1][1] = 1 
    kernel[1][2] = 1 
    kernel[2][0] = 0 
    kernel[2][1] = 1 
    kernel[2][2] = 0 
    dilated = cv2.dilate(img,kernel) 
    cv2.imshow("Dilated", dilated) 
    print "detecting the grid" 
    (contours, _) = cv2.findContours(img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
    contours = sorted(contours, key = cv2.contourArea , reverse = True) 
    screenCnt = None 


    for contour in contours: 
     perimeter = cv2.arcLength(contour,True) 
     approx = cv2.approxPolyDP(contour, CONST_COEFF*perimeter , True) 
     if len(approx) == 4: 
      if perimeter > maxPerimeter: 
       maxPerimeter = perimeter 
       screenCnt = approx 


    cv2.drawContours(originalImage , [screenCnt], -1, (0,255,0), 3) 
    cv2.imshow("SudokuPuzzle", originalImage) 
    cv2.waitKey(0) 

aber was über das gesamte Gitter statt Zeichnung ist passiert, es zieht nur über die untere rechte Feld. enter image description here

Warum passiert das und was kann ich in meinem Code ändern, um über das gesamte Raster zu zeichnen?

Antwort

2

Das einzige, was nicht in Ordnung war, offenbar:

(contours, _) = cv2.findContours(dilated.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

Sollte dilated.copy sein() anstelle von img.copy(). Zuerst dachte ich, dass es keine große Sache, und die größte Kontur sollte noch die Gitter Rand sein, aber Tests haben gezeigt, dass, wenn Sie nicht das Bild erweitern dann die größte Kontur ist dieses Ding

enter image description here

Und deshalb wurde es in der if len(approx) == 4 Klausel ignoriert.

Verwandte Themen