Python 循环不间断
loop without break in Python
我尝试编写最快的代码,select 轮廓内的一个点。我需要点坐标,而不是图像中的像素。我写了这个定义OnePointInsideContour
Determine if a point is inside or outside of a shape with opencv
def OnePointInsideContour(contourArray, PointTuple, tol):
L = len(contourArray);
y0 = PointTuple[0]; # horizontal
x0 = PointTuple[1]; # vertical
ret = [];
inside = False;
counter = 0
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if ycont > y0 - tol and ycont < y0 + tol and xcont > x0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if ycont > y0 - tol and ycont < y0 + tol and xcont < x0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if xcont > x0 - tol and xcont < x0 + tol and ycont < y0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if xcont > x0 - tol and xcont < x0 + tol and ycont > y0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
if counter == 4:
inside = True
return inside, ret
但每次测试一个新点时它使用4个循环沿着轮廓迭代,这意味着100 k点的执行时间约为1小时!在下图中,我展示了一个成功确认给定点(黑点)位于轮廓内的示例。仅仅1分就需要0.012秒
问题是在北(红)、南(绿)、东(青)和西(蓝)点附近的轮廓上可能还有一些其他点,因此第一个找到点 for
循环以 break
停止并开始新的循环,寻找下一个条件。
只有在轮廓上找到所有四个彩色点,才能接受测试点在内部。
有什么建议可以加快执行速度吗?
您一定可以通过改进循环操作来减少计算时间。例如,您可以尝试这样的操作:
found1, found2, found3, found4 = False, False, False, False
for k in range(L):
ycont = list(contourArray[k])[0]
xcont = list(contourArray[k])[1]
if not found1 and (ycont > y0 - tol and ycont < y0 + tol and xcont > x0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found1 = True
if not found2 and (ycont > y0 - tol and ycont < y0 + tol and xcont < x0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found2 = True
if not found3 and (xcont > x0 - tol and xcont < x0 + tol and ycont < y0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found3 = True
if not found4 and (xcont > x0 - tol and xcont < x0 + tol and ycont < y0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found4 = True
请注意,您需要避免中断循环,因为您只是尝试迭代 L 一次。
您似乎有一些可以摆脱的代码复制,下面的所有部分都可以写成一个函数。
...
p = (ycont, xcont)
counter += 1
ret.append(p)
...
我尝试编写最快的代码,select 轮廓内的一个点。我需要点坐标,而不是图像中的像素。我写了这个定义OnePointInsideContour
Determine if a point is inside or outside of a shape with opencv
def OnePointInsideContour(contourArray, PointTuple, tol):
L = len(contourArray);
y0 = PointTuple[0]; # horizontal
x0 = PointTuple[1]; # vertical
ret = [];
inside = False;
counter = 0
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if ycont > y0 - tol and ycont < y0 + tol and xcont > x0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if ycont > y0 - tol and ycont < y0 + tol and xcont < x0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if xcont > x0 - tol and xcont < x0 + tol and ycont < y0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
for k in range(L):
ycont = list(contourArray[k])[0];
xcont = list(contourArray[k])[1];
if xcont > x0 - tol and xcont < x0 + tol and ycont > y0:
p = (ycont, xcont);
counter += 1;
ret.append(p);
break
if counter == 4:
inside = True
return inside, ret
但每次测试一个新点时它使用4个循环沿着轮廓迭代,这意味着100 k点的执行时间约为1小时!在下图中,我展示了一个成功确认给定点(黑点)位于轮廓内的示例。仅仅1分就需要0.012秒
问题是在北(红)、南(绿)、东(青)和西(蓝)点附近的轮廓上可能还有一些其他点,因此第一个找到点 for
循环以 break
停止并开始新的循环,寻找下一个条件。
只有在轮廓上找到所有四个彩色点,才能接受测试点在内部。
有什么建议可以加快执行速度吗?
您一定可以通过改进循环操作来减少计算时间。例如,您可以尝试这样的操作:
found1, found2, found3, found4 = False, False, False, False
for k in range(L):
ycont = list(contourArray[k])[0]
xcont = list(contourArray[k])[1]
if not found1 and (ycont > y0 - tol and ycont < y0 + tol and xcont > x0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found1 = True
if not found2 and (ycont > y0 - tol and ycont < y0 + tol and xcont < x0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found2 = True
if not found3 and (xcont > x0 - tol and xcont < x0 + tol and ycont < y0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found3 = True
if not found4 and (xcont > x0 - tol and xcont < x0 + tol and ycont < y0):
p = (ycont, xcont)
counter += 1
ret.append(p)
found4 = True
请注意,您需要避免中断循环,因为您只是尝试迭代 L 一次。 您似乎有一些可以摆脱的代码复制,下面的所有部分都可以写成一个函数。
...
p = (ycont, xcont)
counter += 1
ret.append(p)
...