python

Python OpenCV를 이용한 라이즈 오브 킹덤즈 매크로(4)

yssy431 2020. 2. 10. 18:52

화면 전처리에 대해 얘기를 해보자면 여러 사진들로 테스트를 해보았다.

하지만 모든 사진들에서 feature matching이 성공적이진 않았다.

 

원본사진

원본 사진을 실수로 삭제하여 아이콘으로 대체

 

매칭 결과물

첫번째 사진에선 아이콘 두개중 두번째를 찾지 못하였다. 원인은 아이콘의 색이 달라서 그렇지 않을까 추정하게 된다.

(조금 더 전처리를 어떻게 해보면 될 것 같지만 추 후에 하는 것으로)

이미지 전처리 과정에서 grayscale 후 일정 색이하는 검은색으로 처리하는 과정을 거쳐서 그런것 같다.

아래 코드 후에 외곽선 검출과 선명도를 높이는 과정을 거친 후 매칭이 여러 이미지 전처리중에서 가장 성공률이 높았다.

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   

    for idx,x in enumerate(gray):
        for idy,y in enumerate(x):
            if y > 145:
                gray[idx][idy] = 255
            else:
                gray[idx][idy] = 0

4장 중에 3장이 정확하게 순서대로 체크를 하게 되었다.

정확하게 마추지 못하여도 다시 누르기 버튼 이 후에 다시 한번 순서마추기를 하면 큰 문제는 아닐 것이라고 생각이 된다. 

인증기의 두가지 방법중 한가지는 이렇게 해결을 할 수 있었다.

다른 한가지인 스크롤바를 옴겨 퍼즐마추기는 쉽게 할 수 있을 거라고 생각이된다. 생각보다 이미지를 다루는 스킬이 많이 늘어 날 수 있었던 것 같다.

 

해당 숫자와 원을 그리는 cv2 함수

cv2.circle(target,axis,2,(255,0,0),2)
cv2.putText(target, count, axis, cv2.FONT_HERSHEY_PLAIN, 2, (255, 255, 0), 2)

앞의 글의 dts_pt의 좌표값을 받아와 원을 그리면 된다.

 

 

만들면서 문제점 중 feature matching 후에 가끔 5개의 match가 정확하게 되고 1~2개의 매치가 이상한 곳을 할때가 있는데 2차원 배열내의 이상치 제거 후 np.mean으로 매치된 중앙점을 받아 왔다. 생각보다 이상치 제거가 쉽지 않은대 그럴때에는 

 for i,(m,n) in enumerate(matches):
        if m.distance < 0.7*n.distance:  ##이부분
            matchesMask[i]=[1,0]
            good.append(m)

0.7을 더 낮게 할수록 매치되는 부분이 줄어든다. 너무 많은 match 된 값들이 생긴다면 0.7보다 낮은 값을 주는 방법도 있다. 역으로 매치가 안된다하면 0.7보다 높은 값을 주는 방법 또한 가능하다.