OpenCV 템 플 릿 일치

최근 에 작은 편 지 는 위 챗 애플 릿 의 자동 화 를 실현 했다.
주로 OpenCV 의 템 플 릿 일치 와 테두리 검출 기술,그리고 안 드 로 이 드 개발 디 버 깅 도구 ADB 와 관련된다.
같이 놓 고 얘 기 하면 내용 이 좀 많은 것 같 아 요.
그래서 3 기로 나 누 어 말 하면 더 많은 것 을 알 수 있다.
먼저 템 플 릿 매 칭 을 소개 한 다음 에 가장자리 검 측 을 하고 마지막 으로 ADB 와 결합 하여'점프'자동 화 를 실현 합 니 다.
게임 은 비록 유행 이 지 났 지만,가 져 와 서 연습 하 는 것 은 그래도 괜찮다.
프로 그래 밍 은 즐 거 워 야 지,하하.
/01/템 플 릿 일치
템 플 릿 이 일치 하 는 것 은 전체 그림 영역 에서 고정자 그림 과 일치 하 는 작은 블록 을 발견 하 는 것 입 니 다.
템 플 릿 그림(주어진 하위 그림)과 검 측 할 그림(원본 그림)이 필요 합 니 다.
검 측 대기 이미지 에서 왼쪽 에서 오른쪽으로,위 에서 아래로 템 플 릿 이미지 와 겹 치 는 하위 이미지 의 일치 도 를 계산 합 니 다.일치 도가 클 수록 둘 이 같 을 가능성 이 큽 니 다.

여 기 는 주로 OpenCV 의cv2.matchTemplate()cv2.minMaxLoc()함수 와 관련된다.
첫 번 째 함수 역할 은 템 플 릿 과 입력 이미지 사이 에서 일치 하 는 결 과 를 찾 는 것 입 니 다.
두 번 째 함수 의 역할 은 주어진 행렬 에서 최대 와 최소 값(그들의 위 치 를 포함)을 찾 는 것 입 니 다.
그 중에서 템 플 릿 일치 알고리즘 은 다음 과 같은 여섯 가지 가 있 습 니 다.

#    ,          ,     0.    ,     
#      
method=CV_TM_SQDIFF
#        
method=CV_TM_SQDIFF_NORMED
#    ,             ,              ,0         
#     
method=CV_TM_CCORR
#       
method=CV_TM_CCORR_NORMED
#    ,                          ,1      ,-1       ,0         (    )
#       
method=CV_TM_CCOEFF
#         
method=CV_TM_CCOEFF_NORMED
표준 화 는 수 치 를 0~1 로 통일 하 는 것 을 의미한다.
제곱 차 유형 을 제외 하고 값 이 작 을 수록 좋 고 다른 것 은 모두 값 이 클 수록 좋다.
/02/이미지 검색
먼저 두 장의 그림 을 보 세 요.모두 그 레이스 케 일 입 니 다.

import cv2
#        
img = cv2.imread('game.png', 0)
#       
temple = cv2.imread('temple.png', 0)
#              
cv2.namedWindow('sample', 0)
cv2.resizeWindow('sample', 400, 600)
cv2.imshow('sample', img)
#             
cv2.namedWindow('target', 0)
cv2.resizeWindow('target', 400, 600)
cv2.imshow('target', temple)
출력 결 과 는 다음 과 같다.

첫 번 째 는 템 플 릿 그림 이 고,두 번 째 는 검 측 대상 그림 입 니 다.
다음은 OpenCV 의 두 함 수 를 사용 하여 템 플 릿 매 칭 을 실현 합 니 다.

#           
th, tw = temple.shape[:2]
print(th, tw)
#           ,1      ,-1       ,0         
result = cv2.matchTemplate(img, temple, cv2.TM_CCOEFF_NORMED)
# result       
# print(result)
# TM_CCOEFF_NORMED          
cv2.namedWindow('match_r', 0)
cv2.resizeWindow('match_r', 400, 600)
#     
cv2.imshow('match_r', result)
#     minMaxLoc,                (val),       (loc)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
#           ,       
tl = max_loc
#         
br = (tl[0]+tw, tl[1]+th)
#      
cv2.rectangle(img, tl, br, (0, 0, 255), 2)
#       
cv2.namedWindow('match', 0)
cv2.resizeWindow('match', 400, 600)
#     
cv2.imshow('match', img)
#   
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결 과 는 다음 과 같다.

첫 번 째 그림 에서 가장 하 얀 위 치 는 가장 높 은 매 칭 을 나타 낸다.
두 번 째 그림 에서 사각형 상 자 는 일치 하 는 결 과 를 나타 낸다.
직사각형 상자 의 위치 파 라 메 터 를 통 해 템 플 릿 이미지 의 크기 와 결합 하면 작은 바둑 중심 점 위치(아래쪽)를 얻 을 수 있 습 니 다.
/03/총괄
이제 점프 의 위 치 를 감지 할 수 있 으 니 다음 단 계 는 네모 난 위치 입 니 다.

좋은 웹페이지 즐겨찾기