Python/Image vision

Corner - 1

noodle-dev 2020. 1. 20. 22:50

Low-Level Vision . 결과가 바로 안나오고 domain에 굉장히 민감.. 어떻게 처리하냐, 어떤 알고리즘을 적용하냐에 따라.

코너는 엣지보다 상위개념.

코너는 엣지가 교차되는 점이다.

QR코드 - 노이즈가 많이 껴도 코너점을 정확히 찾을 수 있다

  • (참고)

자바 v.s. 자바스크립트

다른 언어.

  • 코너는 기본적으로 고주파 성분에 존재

코너⊃엣지

Harris Corner Detection

해리스 코너 추출 함수 cornerHarris는 이미지 위에 커널을 이동시키면서 그레디언트의 변화량을 구하고 이 값을 적절한 기준값으로 구별하여 코너점을 찾는다.

src = cv2.imread('../img/building.jpg')
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

#  block 크기, 소벨크기,         R=Det() - kTr()
harris = cv2.cornerHarris(gray, 3, 3, 0.04)  # R값 반환
harris_norm = cv2.normalize(harris, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
#min~max 구간으로 scsaling하는 함수


dst = src.copy()

for y in range(harris_norm.shape[0]):              #행렬이니까 y먼저->x
        for x in range(harris_norm.shape[1]):
            if harris_norm[y, x] > 120:
                    cv2.circle(dst, (x, y), 5, (0, 0, 255), 2)  #원점,반지름,색,두께

imshow('gray', gray)
imshow('harris_norm', harris_norm)
print(harris_norm.dtype)  #uint8 : numpy type. (파이썬에는 uint8 없음)
imshow('dst', dst)

FAST

FAST(Features from Accelerated Segment Test)도 코너를 찾는 알고리즘이다. 이름처럼 빠른 연산으로 유명하다.

Decision Tree를 이용해서 코너인가 아닌가를 판단한다.

  1. 한 픽셀 p 를 중심으로하는 3픽셀의 반지름을 가지는 원을 만들고,
  2. 그 원 위의 16개의 픽셀 값을 보고 코너를 찾는다.
  3. p보다 기준값 이상 밝거나, 어두운 픽셀들이 n개 이상 연속적으로 존재하면 p를 Corner로 판단한다.
src = cv2.imread('../img/chessboard.jpg', cv2.IMREAD_GRAYSCALE)

fast = cv2.FastFeatureDetector_create(50)
# 작아지면 코너 많이 검출됨, 원에서도 검출되지만 중첨되서 검출될수 있음. like threshold.
keypoints = fast.detect(src) #특징점

dst = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)

for kp in keypoints:
        pt = (int(kp.pt[0]), int(kp.pt[1]))
        cv2.circle(dst, pt, 5, (0, 0, 255), 2)

imshow('src', src)
imshow('dst', dst)

참고) ms계열 깔 땐 콘솔창 restart

QR Code가 OCR보다 성능이 훨씬 좋아

OCR 의 문제: 정확도를 확인할 수 없음

QR CODE는 디코딩만 하면 돼.