이번편에서는

Kaze Feature Matching algorithm을 이용한 화면 내 이미지 찾기 방법을 정리한다.
해당 알고리즘을 알기 전까지는 Sikuli등의 library를 통해서 현재 화면내 이미지를 찾았다.
다만 회귀 테스트를 하다보면 생각만큼 이미지가 잘 찾아지지는 않았다.

그러던 중 Opencv의 Feature Matching방법이 있는 것을 알게 되었다.

Feature Matching이란?

Feature matching이란 다음 그림처럼
image.png

원하는 이미지의 특징점을 찾아서 그와 유사한 이미지가 있는 곳을 찾는 방식이다.

이 방식의 장점은 이미지가 회전하거나, 화면 size의 차이가 있거나, 조금의 변화가 있어도, 이미지를 찾을 수 있는 장점이 있다.

아마 이미지 비교 방식으로 회귀 테스트를 해보신 분들이 이 글을 읽고 있다면
이 방식을 사용해서 거의 유사한 이미지를 찾는게 중요하다는 것에 공감 할 것이다.
기존의 방식(ex, sikuli등)은 pixel비교 형태에 가까워서 이미지가 회전, 사이즈등의 차이가 있을때 잘 안찾아 졌다.
하지만 Kaze를 사용한 Feature Matching을 통해서는 그 점을 극복 할 수 있다.

왜 Kaze?

opencv에서 Feature Matching을 해주는 알고리즘은 많이 존재한다.

  • SIFT, SURF, KAZE, AKAZE, ORB, BRISK

이 중 KAZE를 선택한 이유는 무료고 성능이 비교적 우수해서 이다.
※ Feature Matching에서 많이 유명한 알고리즘인 SIFT와 SURF는 유료!

Kaze를 통해서 화면 내 이미지 찾기

나도 완전히 이해하지 못한 Kaze알고리즘의 구현방법을 설명하기는 힘들고, 이미 구현된 Apache License의 source를 빌려와서 다음 library만들었다.

해당 library에 다음 function을 통해서 이미지 찾기 수행이 가능하도록 세팅했고,
변수를 설명하면 다음과 같다.
1. im_search_path : 찾고자 하는 이미지
2. im_source_path : 찾는 대상 이미지(전체 화면 등)
3. threshold : 정확도
4. rgb : rgb 색상도 비교하는지 여부

def find_almost_similar_image_locations(im_search_path, im_source_path, threshold=0.8, rgb=True):

샘플용 이미지를 다음과 같이 준비한다.
찾는 대상 이미지 파일(source.jpg)
image.png

찾고자 하는 이미지(search1.jpg)
image.png

찾아진 결과의 사각형 좌표를 원소스에서 잘라서 보여주는 function

def showimage(img_path, result):
    src = cv2.imread(img_path, cv2.IMREAD_COLOR)

    dst = src.copy()
    y0 = int(result['rectangle'][0][0])
    y1 = int(result['rectangle'][2][0])
    x0 = int(result['rectangle'][0][1])
    x1 = int(result['rectangle'][2][1])
    roi = src[x0:x1, y0:y1]

    cv2.imshow("dst", roi)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

수행결과(search1.jpg)

def test1():
    result = find_almost_similar_image_locations('search1.jpg', 'source.jpg')
    showimage('source.jpg', result)

image.png

찾고자 하는 이미지(search2.jpg) ※ 이미지를 회전 시킴
image.png

수행결과(search2.jpg)

def test2():
    result = find_almost_similar_image_locations('search2.jpg', 'source.jpg')
    showimage('source.jpg', result)

오류 발생, 원인 : 기본 정확도(80%)가 너무 높음
image.png

정확도 값을 60%로 변경하여 재수행

def test3():
    result = find_almost_similar_image_locations('search2.jpg', 'source.jpg', 0.6)
    showimage('source.jpg', result)

결과 성공
image.png

소스 Git URL : https://github.com/jjunghyup/KazeMatching.git

profile
안녕하세요~ :)

0개의 댓글