파이썬으로 바둑판 눈을 이미지에서 인식 (스도쿠)
htps : // 라고 해서 r. 이 m/하 t_접기/s타츠 s/1230424166546886663? s=20
바둑판 눈의 이미지 인식
최근 Python에서의 AI 개발이 붐으로, 장기 등의 보드 게임에 관해서는 소스도 잘 보게 되었다.
이러한 소스에 관해서는 공통적으로, "바둑판 눈의 인식"이라고 하는 것이 포함되어 있으므로, 이번 그것을 사용하게 되었다.
우연히도, 장기반도 스도쿠도 9x9의 바둑판이므로, 잘 유용할 수 있었다고 생각한다.
유용한 소스
이번에는 이쪽을 사용하게 되었다. 우선 감사합니다.
장기판을 이미지 인식
여기 GitHub 의 shogi-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.pyimport 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
Reference
이 문제에 관하여(파이썬으로 바둑판 눈을 이미지에서 인식 (스도쿠)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hatt_takumi/items/47a46d5e85223a41afa4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이번에는 이쪽을 사용하게 되었다. 우선 감사합니다.
장기판을 이미지 인식
여기 GitHub 의
shogi-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.pyimport 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
Reference
이 문제에 관하여(파이썬으로 바둑판 눈을 이미지에서 인식 (스도쿠)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hatt_takumi/items/47a46d5e85223a41afa4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# contours = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]
contours = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
# BASE_SIZE = 64
BASE_SIZE = 32
# 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
Reference
이 문제에 관하여(파이썬으로 바둑판 눈을 이미지에서 인식 (스도쿠)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hatt_takumi/items/47a46d5e85223a41afa4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이번은 거의 유용하게 해 버렸기 때문에, 그다지 세세한 내용까지 밟고 있지 않다,,,
우선, Python으로 스도쿠를 인식하는, 풀기, 곳까지 할 수 있었으므로, 시가는 OCR로 문자 인식해, 화상으로부터 데이터화까지 가져간다.
그리고 파이썬에서 스도쿠를 인식합니다. 이것들을 연결하면, ,. #Python
Reference
이 문제에 관하여(파이썬으로 바둑판 눈을 이미지에서 인식 (스도쿠)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hatt_takumi/items/47a46d5e85223a41afa4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)