파이썬으로 바둑판 눈을 이미지에서 인식 (스도쿠)

16748 단어 파이썬OpenCVnumpy
이 문서는 파이썬으로 스도쿠를 풀다
htps : // 라고 해서 r. 이 m/하 t_접기/s타츠 s/1230424166546886663? s=20

바둑판 눈의 이미지 인식



최근 Python에서의 AI 개발이 붐으로, 장기 등의 보드 게임에 관해서는 소스도 잘 보게 되었다.
이러한 소스에 관해서는 공통적으로, "바둑판 눈의 인식"이라고 하는 것이 포함되어 있으므로, 이번 그것을 사용하게 되었다.
우연히도, 장기반도 스도쿠도 9x9의 바둑판이므로, 잘 유용할 수 있었다고 생각한다.

유용한 소스



이번에는 이쪽을 사용하게 되었다. 우선 감사합니다.

장기판을 이미지 인식

여기 GitHubshogi-camera/shogicam/preprocess/ 를 스도쿠용으로 다시 써서 import하여 사용한다.

재작성 장소



_board_detection.py 37행의 contours 변경

_board_detection.py
    # contours = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]
    contours = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]

_trim_board.py 다섯 번째 줄의 BASE_SIZE를 32로 변경

_trim_board.py
# BASE_SIZE = 64
BASE_SIZE = 32

_trim_board.py 7행의 w를 BASE_SIZE*15로 변경

_trim_board.py
# w = BASE_SIZE * 14
w = BASE_SIZE * 15

소스 코드



board_detection.py
import cv2
import numpy as np
from _detect_corners import *
from _trim_board import *

def show_fitted(img, x):
    cntr = np.int32(x.reshape((4, 2)))
    blank = np.copy(img)
    cv2.drawContours(blank, [cntr], -1, (0,255,0), 2)
    return blank

def split_image(img, x, y, line):
    height, width, channels = img.shape
    h = height//y
    w = width//x
    line_h = round(h*line)
    line_w = round(w*line)
    counter = 0
    for split_y in range(1, y+1):
        for split_x in range(1, x+1):
            counter += 1
            clp = img[ (h*(split_y-1))+line_h:(h*(split_y))-line_h, (w*(split_x-1))+line_w:(w*(split_x))-line_w]
            cv2.imwrite("./raw_img/{}.png".format(counter), clp)
    counter = 0

def draw_ruled_line(img, show=True):
    base_size = 32
    w = base_size * 15
    h = base_size * 15
    img = img.copy()
    for i in range(10):
        x = int((w / 9) * i)
        y = int((h / 9) * i)
        cv2.line(img, (x, 0), (x, h), (0, 0, 255), 1)
        cv2.line(img, (0, y), (w, y), (0, 0, 255), 1)
    if show:
        display_cv_image(img)
    return img

if __name__ == "__main__":
    raw_img = cv2.imread("./sudoku.png")
    fit_img = fit_size(raw_img, 500, 500)

    polies = convex_poly(fit_img, False)
    poly = select_corners(fit_img, polies)
    x0 = poly.flatten()
    img = show_fitted(fit_img, x0)

    rect, score = convex_poly_fitted(img)

    trimed = trim_board(raw_img, normalize_corners(rect) * (raw_img.shape[0] / img.shape[0]))
    lined = draw_ruled_line(trimed, False)

    cv2.imshow('image', fit_img)
    cv2.waitKey(0)
    cv2.imshow('image', img)
    cv2.waitKey(0)
    cv2.imshow('image', trimed)
    cv2.waitKey(0)
    cv2.imshow('image', lined)
    cv2.waitKey(0)

    split_image(trimed, 9, 9, 0)

'sudoku.png'로서 같은 계층에 저장한 png 파일에 대하여 조작한다.
윤곽의 검출로 사각형을 검출한 후, 호모그래피로 정면으로부터의 화상으로 변환하고 있다. ( 참고 )
검출 후의 조작은 간단하고, 등간격으로 종횡 9분할하고, 잘라서 보존할 뿐. 나중에 이러한 이미지 한 장 한 장에 대해 OCR을 수행합니다.
(이후의 페이스로 또 말하지만, 이 처리라면 테두리가 방해로 잘 인식할 수 없기 때문에, 조금 궁리가 필요)

실행 결과



이런 이미지에 대해

문제의 윤곽 감지

검출된 영역을 호모그래피로 정사각형으로 변환

종횡 9x9로 분할한다(이미지는 선을 그려 표시한 것만)

raw_img 폴더 이하에, 분리한 화상이 81매 보존된다.


마지막으로



이번은 거의 유용하게 해 버렸기 때문에, 그다지 세세한 내용까지 밟고 있지 않다,,,
우선, Python으로 스도쿠를 인식하는, 풀기, 곳까지 할 수 있었으므로, 시가는 OCR로 문자 인식해, 화상으로부터 데이터화까지 가져간다.

그리고 파이썬에서 스도쿠를 인식합니다. 이것들을 연결하면, ,. #Python

좋은 웹페이지 즐겨찾기