2017-12-21 20 views
1

나는이 파이썬 스크립트를 써서 이미지를 추적했다. 그러나 그것은 오류를 던지고있다. "IndexError : 인덱스 181이 181 축의 범위를 벗어났습니다" 내 이미지 크기가 181x158 인 곳을 보여줍니다. 이 오류를 바로 잡기 위해 범위를 줄 였지만 사용하지 않았습니다.파이썬에서 이미지 트레이스

import cv2 
import numpy as np 
global p 
a = cv2.imread('t.png',0); 
b = (255 -a); 
c = np.asarray(b); 
p = np.count_nonzero(c) 
[ay , ax] = c.shape; 
z = np.zeros(c.shape, dtype=np.int) 

def startTrace(yt,xt): 
    global p 
    p = p-1 
    z[yt,xt] = 255; 
    c[yt,xt] =0; 
    if (c[yt, xt+1] > 0): 
     startTrace(yt,xt+1) 
    elif (c[yt+1,xt+1] > 0): 
     startTrace(yt+1,xt+1) 
    elif (c[yt+1,xt] > 0): 
     startTrace(yt+1,xt) 
    elif (c[yt+1,xt-1] >0) : 
     startTrace(yt+1,xt-1) 
    elif (c[yt,xt-1] >0): 
     startTrace(yt,xt-1) 
    elif (c[yt-1,xt-1] > 0): 
     startTrace(yt-1,xt-1) 
    elif (c[yt-1,xt] > 0): 
     startTrace(yt-1,xt) 
    elif (c[yt-1,xt+1] > 0): 
     startTrace(yt-1,xt+1) 


while (p > 0): 
    for y in range(1,ay-2): 
     for x in range(1,ax-2): 
      if c[y,x] > 0 : 
       startTrace(y,x); 
+1

파이썬리스트는 0에서 시작하므로 alist 길이 5 경우, 첫 번째 항목 alist [0] 마지막 항목 [4] – ShpielMeister

+0

yt'과'xt' '에 대한 범위를 제한 alist 시도되고 'startTrace'에 있습니다. 그들은 이미지의 크기를 넘어서고, 여기에'ax'와'ay'를 말할지도 모릅니다. – David

+0

추적이란 무엇입니까? 또한 당신의'startTrace'는 기본 조건을 가지고 있지 않으며 재귀는 무한대로 실행될 수 있습니다. – ZdaR

답변

0

모두에게 감사드립니다. 이 코드는 올바르게 작동합니다.

import cv2 
import numpy as np 


global p 
a = cv2.imread('t.png',0); 
[ty,tx] = a.shape; 
o = np.zeros((ty+2,tx+2),dtype=np.int) 
o[1:ty+1,1:tx+1] = (255 -a); 
c = np.asarray(o); 
p = np.count_nonzero(c) 
[ay , ax] = c.shape; 
z = np.zeros(c.shape, dtype=np.int) 

def startTrace(yt,xt): 
    global p 
    cv2.imshow('image',z); 
    z[yt,xt] = 255; 
    c[yt,xt] =0; 
    p = np.count_nonzero(c) 
    if((yt < ay-1) and (xt < ax -1)): 
     if (c[yt, xt+1] > 0): 
      startTrace(yt,xt+1) 
     elif (c[yt+1,xt+1] > 0): 
      startTrace(yt+1,xt+1) 
     elif (c[yt+1,xt] > 0): 
      startTrace(yt+1,xt) 
     elif (c[yt+1,xt-1] >0) : 
      startTrace(yt+1,xt-1) 
     elif (c[yt,xt-1] >0): 
      startTrace(yt,xt-1) 
     elif (c[yt-1,xt-1] > 0): 
      startTrace(yt-1,xt-1) 
     elif (c[yt-1,xt] > 0): 
      startTrace(yt-1,xt) 
     elif (c[yt-1,xt+1] > 0): 
      startTrace(yt-1,xt+1) 


while (p > 0): 
    for y in range(1,ay-2): 
     for x in range(1,ax-2): 
      if (c[y,x] > 0) : 
       startTrace(y,x); 
1

코드는 재귀 적이며 (startTrace는 자체 호출 함) 사용자가 코드 자체를 호출하는 횟수를 모를 수 있습니다. 실제로 startTrace()에 대한 단일 호출이 종료된다는 것을 확신 할 수 있습니까? startTrace()를 startTrace()를 영원히 호출 할 수 있습니까? 결국 스택 오버플로가 발생합니다. 그러나 이것은 (아직) 당신의 문제가 아닙니다.

startTrace를 호출 할 때마다 startTrace()에 대한 원래 호출과 다른 매개 변수 (+1, -1)가 있기 때문에 코드가 실패합니다. "while"안에있는 호출이 범위를 벗어나지 않는다고 확신하더라도 startTrace()가 재귀 적으로 호출되면 각각의 새 호출은 원래 매개 변수 +1을 가질 수 있습니다. 결국 원래 매개 변수는 +1이되어 결국에는 범위를 벗어납니다. 매개 변수가 이미지의 경계 안에 있다는 startTrace() 내부. 함수의 시작 부분에 if를 추가하여 xt 및 yt가 이미지 경계 안에 있는지 확인해야합니다.

어쨌든, OpenCV에서 원하는 것을 수행하는 방법을 검색하는 것이 좋습니다. findContours를 예로 들어 보겠습니다.