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()
출력결과
사진에서 손상된 영역을 복원 - 인 페이팅 By OpenCV (0) | 2021.06.15 |
---|---|
OpenCV 문서 스캐너 구현하기 (2) | 2021.05.25 |
이미지 슬라이드 쇼 실습 (0) | 2021.05.12 |
K-최근접이웃(K-Nearest Neighbor) 분류기 예제 - OpenCV (0) | 2021.02.14 |
댓글 영역