객체 단위 분석
레이블링(Connected Component Labeling)
외곽선 검출(Contour Tracing)
외곽선 검출이란?
객체 하나의 외곽선 표현 방법
여러 객체의 외곽선 표현 방법
cv2.findContours(image, mode, method, contours=None,
hierarchy=None, offset=None) -> contours, hierarchy
해당 외곽선이 없으면 -1을 가짐
- Method
1. CHAIN_APPROX_NONE: 근사화 없음
2. CHAIN_APPROX_SIMPLE: 수직선, 수평선, 대각선에 대해 끝점만 사용하여 압축
3. CHAIN_APPROX_TC89_L1: Teh & Chin L1 근사화
4. CHAIN_APPROX_TC89_KCOS: Teh & Chin k cos 근사화
cv2.contourArea(contour, oriented=None) -> retval
cv2.arcLength(curve, closed) -> retval
cv2.boundingRect(array) -> retval
cv2.minEnclosingCircle(points) -> center, radius
cv2.approxPolyDP(curve, epsilon, closed, approxCurve=None) -> approxCurve
[https://thebook.io/006939/ch12/02/02-03/](https://thebook.io/006939/ch12/02/02-03/)
cv2.isContourConvex(contour) -> retval
cv2.getPerspectiveTransform(src, dst, solveMethod=None) -> retval
cv2.warpPerspective(src, M, dsize, dst=None, flags=None,
borderMode=None, borderValue=None) -> dst
import sys
import cv2
import numpy as np
src = cv2.imread('namecard1.jpg')
if src is None:
print('image load failed')
sys.exit()
# src = cv2.resize(src, (640, 480))
#src = cv2.resize(src, (0, 0), fx=0.5, fy=0.5)
# 흑백흑백
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
# 이진화 => 임계값 함수 => otsu를 쓰니 알아서 하라고 0을 줌.
_, src_bin = cv2.threshold(src_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
contours, _ = cv2.findContours(src_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print(len(contours))
for pts in contours:
if cv2.contourArea(pts) < 1000:
continue
approx = cv2.approxPolyDP(pts, cv2.arcLength(pts, True)*0.02, True)
if len(approx) != 4:
continue
w, h = 900, 500
srcQuad = np.array([[approx[0, 0, :]], [approx[1, 0, :]], \
[approx[2, 0, :]], [approx[3, 0, :]]]).astype(np.float32)
dstQuad = np.array([[0, 0], [0, h], [w, h], [w, 0]]).astype(np.float32)
pers = cv2.getPerspectiveTransform(srcQuad, dstQuad)
dst = cv2.warpPerspective(src, pers, (w, h))
cv2.polylines(src, pts, True, (0, 0, 255))
# cv2.imshow('src',src)
# cv2.imshow('src_gray',src_gray)
# cv2.imshow('src_bin',src_bin)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()