2013-06-29 4 views
0

여기에 설명 된대로 수행하려고합니다 : Finding a subimage inside a Numpy image 스크린 샷 내부의 이미지를 검색 할 수 있습니다.큰 이미지 내부에 작은 이미지 찾기 (PIL + OpenCV)

코드는 다음과 같습니다

import cv2 
import numpy as np 
import gtk.gdk 
from PIL import Image 

def make_screenshot(): 
    w = gtk.gdk.get_default_root_window() 
    sz = w.get_size() 
    pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, sz[0], sz[1]) 
    pb = pb.get_from_drawable(w, w.get_colormap(), 0, 0, 0, 0, sz[0], sz[1]) 
    width, height = pb.get_width(), pb.get_height() 
    return Image.fromstring("RGB", (width, height), pb.get_pixels()) 

if __name__ == "__main__": 
    img = make_screenshot() 
    cv_im = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) 
    template = cv_im[30:40, 30:40, :] 
    result = cv2.matchTemplate(cv_im, template, cv2.TM_CCORR_NORMED) 
    print np.unravel_index(result.argmax(), result.shape) 

나는 완전히 다른 좌표를 얻고있다 (대신 cv2.TM_CCORR_NORMED의) 선택 방법에 따라,하지만 그들 중 누구도 예에서와 같이 (30, 30)입니다.

제게 이런 접근 방식에있어 잘못된 점을 가르쳐주세요.

+0

matchtemplate은 객체를 둘러싼 직사각형의 왼쪽 위 모서리를 제공합니다. 그걸 확인 했니? –

+0

예, 알고 있습니다. 그리고 그것은 저에게 (0, 0) 또는 (256, 400) 또는 그와 비슷한 것을 제공합니다. 현실에 가까운 것은 아닙니다. – Enchantner

답변

0

짧은 답변 : 변수 maxLoc는 X를 포함하는 튜플의 왼쪽 상단의 Y 인덱스를 개최한다

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) 

: 당신은 최고의 경기의 모서리를 찾기 위해 다음 줄을 사용할 필요가 최고의 경기.

긴 않음 :

cv2.matchTemplate()는 각 인덱스의 번호가 입력 화상 그 인덱스에서의 템플릿 매칭에 얼마나 잘 대응하는 하나의 채널 이미지를 리턴한다. matchTemplate을 호출 한 후 다음 코드 줄을 삽입하여 결과를 시각화하면 numpy가 왜 어려운 지 알 수 있습니다.

cv2.imshow("Debugging Window", result) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

minMaxLoc()는 matchTemplate에서 반환 한 결과를 원하는 정보로 바꾸어줍니다. 템플리트가 최악의 성냥을 가졌는지 또는 최상의 성냥과 최악의 성냥에서 어떤 가치가 유지되었는지 알고 싶다면, 그 값을 사용할 수도 있습니다.

이 코드는 파일에서 읽은 예제 이미지에서 저에게 효과적이었습니다. 코드가 오작동하는 경우 이미지를 원하는 방식으로 읽지 않는 것일 수 있습니다. 위의 코드 스 니펫은 OpenCV로 디버깅하는 데 유용합니다. imshow의 인수 결과를 이미지 객체 (numpy 배열)의 이름으로 바꾸면 원하는 이미지를 얻고 있는지 시각적으로 확인할 수 있습니다.

관련 문제