我写了这个python脚本来跟踪图像。但这引发了错误。它显示“IndexError:索引181超出轴0的大小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);
最佳答案
请注意,您的代码是递归的(startTrace调用自身),并且您不知道它将调用自身多少次。实际上,您可以确保对startTrace()的单个调用将永远退出吗? startTrace()可以永远调用startTrace()吗?这最终会导致堆栈溢出。但这还不是您的问题。
该代码失败,因为每个对startTrace()的调用都与原始对startTrace()的调用具有不同的参数(+1,-1)。即使在“while”内进行调用确保您不会超出范围,如果递归调用startTrace(),每个新调用也可能具有原始参数+1,最终它会超出范围(没有检查)在startTrace()中,该参数位于图片的边界内)。您应该在函数的开头添加if,以检查xt和yt是否在图像范围内。
无论如何,我建议在OpenCV中搜索符合您要求的方法。例如,看看findContours。