- OpenCV connectedComponentsWithStats를 활용한 손 글씨 인식 -

 

 

 

<개요>

1. 손 글씨 이미지를 불러옵니다.

2. 이미지 프로세싱을 통해 글자는 흰색(255), 배경은 검은색(0)으로 만들어 줍니다.

3. connectedComponentsWithStats 함수를 이용해 글자를 인식합니다.

4. 인식한 글자에 bbox를 그려줍니다.

 

# labeling

레이블링은 객체 구역을 영역 단위로 분석하는 것입니다.

서로 연결되어 있는 객체 픽셀에 고유한 번호를 지정하는 작업입니다.

일반적으로 이진 영상에서 수행합니다.

0은 배경 1 이상은 객체로 판단합니다.

객체들이 서로 연결되어 있으면 같은 번호를 지정합니다.

8-이웃 연결 관계

 

# cv2.connectedComponentsWithStats

반환 값으로 retval, labels, stats, centroids 반환합니다.

 

 retval : 객체 수 + 1 (배경 포함)

 

 labels : 객체에 번호가 지정된 레이블 맵

 

 stats : N행 5열, N은 객체 수 + 1이며 각각의 행은 번호가 지정된 객체를 의미, 5열에는 x, y, width, height, area 순으로 정보가 담겨 있습니다. x,y 는 좌측 상단 좌표를 의미하며 area는 면적, 픽셀의 수를 의미합니다.

 

 centroids : N행 2열, 2열에는 x,y 무게 중심 좌표가 입력되어 있습니다. 무게 중심 좌표는 픽셀의 x 좌표를 다 더해서 개수로 나눈 값입니다. y좌표도 동일합니다.

 

 

 

<코드 설명>

import cv2 as cv

# 이미지 불러오기
src = cv.imread('./images/num.jpg')
img = src.copy()

# gray 화
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 이진화
th, bin_img = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)

# 색감 반대 : 검(0), 흰(255)
bin_img_reverse = 255 - bin_img
cv.imshow('bin_reverse', bin_img_reverse)
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV 라이브러리를 import 해줍니다.

이진화 후 색감을 반대로 해주는 이유는 앞서 언급했듯이 레이블링을 하기 위해 숫자를 객체로 인식하기 위함입니다.

 

손 글씨 원본 이미지

 

이진화 후 글씨가 흰색, 배경이 검은색으로

 

 

# connectedComponentsWithStats 함수 사용
retvals, labels, stats, centroids = cv.connectedComponentsWithStats(bin_img_reverse)

show_img = src.copy()

# 라벨링된 객체별로 각 stats를 구해 rectangle 함수를 이용하여 bbox를 그려줌
for i in range(1, retvals):
    x, y, w, h, area = stats[i]

    # 너무 작은 블롭 제외
    if area > 60:
        # 바운딩 박스
        cv.rectangle(show_img, (x, y, w, h), (0, 0, 255), thickness=2)

cv.imshow('rec_img', show_img)
cv.waitKey(0)
cv.destroyAllWindows()

cv2.connectedComponentsWithStats 함수와 cv2.rectangle 함수를 이용하여 원본 이미지에 bbox를 그려줍니다.

 

 

 

<전체 코드>

import cv2 as cv

src = cv.imread('./images/num.jpg')
img = src.copy()

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
th, bin_img = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)
bin_img_reverse = 255 - bin_img

retvals, labels, stats, centroids = cv.connectedComponentsWithStats(bin_img_reverse)

show_img = src.copy()
for i in range(1, retvals):
    x, y, w, h, area = stats[i]
    if area > 60:
        cv.rectangle(show_img, (x, y, w, h), (0, 0, 255), thickness=2)

cv.imshow('rec_img', show_img)
cv.waitKey(0)
cv.destroyAllWindows()

 

 

 

<실행 화면>

결과 이미지

손 글씨 인식 완료

 

 

 

- Just Do It -

 

반응형

'Python > Machine_vision' 카테고리의 다른 글

[Python] YoloV5 custom dataset 학습  (0) 2021.08.14
[Python] 얼굴 인식  (0) 2021.07.24
복사했습니다!