- OpenCV connectedComponentsWithStats를 활용한 손 글씨 인식 -
<개요>
1. 손 글씨 이미지를 불러옵니다.
2. 이미지 프로세싱을 통해 글자는 흰색(255), 배경은 검은색(0)으로 만들어 줍니다.
3. connectedComponentsWithStats 함수를 이용해 글자를 인식합니다.
4. 인식한 글자에 bbox를 그려줍니다.
# labeling
레이블링은 객체 구역을 영역 단위로 분석하는 것입니다.
서로 연결되어 있는 객체 픽셀에 고유한 번호를 지정하는 작업입니다.
일반적으로 이진 영상에서 수행합니다.
0은 배경 1 이상은 객체로 판단합니다.
객체들이 서로 연결되어 있으면 같은 번호를 지정합니다.
# 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 |