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)
...