상세 컨텐츠

본문 제목

KNN 으로 필기체 인식하기

영상처리/OpenCV 실습

by cepiloth 2021. 3. 29. 11:07

본문

728x90
반응형

OpenCV 머신러닝 class 중 KNN 을 사용합니다.

KNN 을 사용하는 전체 흐름도

 

필기체 인식을 위한 사전 데이터


전체 소스 코드

import sys
import numpy as np
import cv2


oldx, oldy = -1, -1

#숫자를 그리는 mouse callback
def on_mouse(event, x, y, flags, _):
    global oldx, oldy

    if event == cv2.EVENT_LBUTTONDOWN:
        oldx, oldy = x, y

    elif event == cv2.EVENT_LBUTTONUP:
        oldx, oldy = -1, -1

    elif event == cv2.EVENT_MOUSEMOVE:
        if flags & cv2.EVENT_FLAG_LBUTTON:
            cv2.line(img, (oldx, oldy), (x, y), (255, 255, 255), 40, cv2.LINE_AA)
            oldx, oldy = x, y
            cv2.imshow('img', img)


# 학습 & 레이블 행렬 생성
digits = cv2.imread('digits.png', cv2.IMREAD_GRAYSCALE)

if digits is None:
    print('Image load failed!')
    sys.exit()

h, w = digits.shape[:2]

#가로로 100개 세로로 20개 분리
cells = [np.hsplit(row, w//20) for row in np.vsplit(digits, h//20)]
#digits 20 개의 label 로 분리
cells = np.array(cells)
train_images = cells.reshape(-1, 400).astype(np.float32)
train_labels = np.repeat(np.arange(10), len(train_images)/10)

# KNN 학습
knn = cv2.ml.KNearest_create()
knn.train(train_images, cv2.ml.ROW_SAMPLE, train_labels)

# 사용자 입력 영상에 대해 예측

img = np.zeros((400, 400), np.uint8)

cv2.imshow('img', img)
cv2.setMouseCallback('img', on_mouse)

while True:
    key = cv2.waitKey()

    if key == 27:
        break
    elif key == ord(' '):
        test_image = cv2.resize(img, (20, 20), interpolation=cv2.INTER_AREA)
        test_image = test_image.reshape(-1, 400).astype(np.float32)

        ret, _, _, _ = knn.findNearest(test_image, 3) # 마지막 인자는 k 값이 추정치
        print(int(ret))

        img.fill(0)
        cv2.imshow('img', img)

cv2.destroyAllWindows()

 

출력결과

728x90
반응형

관련글 더보기

댓글 영역