화면 전처리에 대해 얘기를 해보자면 여러 사진들로 테스트를 해보았다.
하지만 모든 사진들에서 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보다 높은 값을 주는 방법 또한 가능하다.
'python' 카테고리의 다른 글
Python iterable 객체의 데이터를 받는 method 속도비교 (0) | 2020.07.23 |
---|---|
Email parser 제작기 (0) | 2020.07.22 |
Python OpenCV를 이용한 라이즈 오브 킹덤즈 매크로(3) (0) | 2020.02.10 |
Python OpenCV를 이용한 라이즈 오브 킹덤즈 매크로(2) (0) | 2020.02.09 |
Python OpenCV를 이용한 라이즈 오브 킹덤즈 매크로(1) (1) | 2020.02.07 |