2017-12-21 4 views
1

I Schrieb dieses Python-Skript, um das Bild zu verfolgen. Aber es wirft einen Fehler auf. Es zeigt "IndexError: Index 181 ist außerhalb der Grenzen für Achse 0 mit der Größe 181" wo meine Bildgröße ist 181x158. Ich habe den Bereich verkleinert, um diesen Fehler zu beheben, aber nutzlos.Verfolgen Sie ein Bild in Python

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

Python Listen beginnen bei Null, so dass, wenn alist 5 Länge hat, ist das erste Element alist [0] und das letzte Element ist alist [4] – ShpielMeister

+0

Versuchen Sie, den Bereich für 'yt' und' xt' zu begrenzen in 'startTrace'. Sie können über die Größe des Bildes hinausgehen, sagen "Axt" und "Ai" hier. – David

+0

Was meinst du mit Trace? Auch Ihre 'startTrace' hat keine Basisbedingung und die Rekursion kann unendlich laufen. – ZdaR

Antwort

0

Dank Ihnen allen für Ihre Hilfe. Dieser Code funktioniert ordnungsgemäß.

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

Beachten Sie, dass Ihr Code rekursiv ist (Starttrace nennt sich), und Sie wissen nicht, wie oft sie sich nennen. Können Sie sicher sein, dass ein einzelner Aufruf von startTrace() jemals beendet wird? Könnte startTrace() für immer startTrace() aufrufen? Dies würde schließlich zu einem Stapelüberlauf führen. Aber das ist (noch) nicht dein Problem.

Der Code schlägt fehl, da jeder Aufruf von startTrace andere Parameter (+1, -1) als der ursprüngliche Aufruf von startTrace() hat. Selbst wenn Aufruf innerhalb der "while" sicherstellt, dass Sie nicht außerhalb der Grenzen sind, wenn startTrace() rekursiv aufgerufen wird, kann jeder neue Aufruf den ursprünglichen Parameter +1 haben, der schließlich außerhalb der Grenzen wachsen wird (es gibt keine Überprüfung Innerhalb von startTrace() befindet sich der Parameter innerhalb der Grenzen des Bildes. Sie sollten ein if am Anfang Ihrer Funktion hinzufügen, um zu überprüfen, ob sich xt und yt innerhalb der Grenzen des Bildes befinden.

Wie auch immer, ich würde vorschlagen, in OpenCV für eine Methode zu suchen, die tut, was Sie wollen. Schauen Sie sich zum Beispiel findContours an.

Verwandte Themen