python 函数内的 IF 循环

IF loop inside a function in python

我有一个函数,我想在其中执行 if 语句。我知道这在 Python 中是不可能的,所以我在实现 if 语句之前添加了一个 while 循环,但似乎 while 循环没有停止,或者也许这可能是另一个问题。

def hough(frame): 
    
    #calculate the median 
    medianFrame = np.median(randframes,axis=0).astype(dtype=np.uint8)
    grayMedianFrame = cv2.cvtColor(medianFrame, cv2.COLOR_BGR2GRAY)
    
    gframe = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #grayscale frame
    dframe = cv2.absdiff(gframe, grayMedianFrame)  #remove background

    blurred = cv2.GaussianBlur(dframe,(11,11),cv2.BORDER_DEFAULT)  #Gausian blur with standard deviation of 11
    
    while True: 
        
        circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT,1,120,param1= 50, param2=30,minRadius=0,maxRadius=0)
        
        if circles is None: 
            radius.append(0)
            continue
        
        else: 
            circles = np.uint16(np.around(circles))
            
            for j in circles[0, :]: 
            
                # draw the outer circle
                cv2.circle(frame, (j[0], j[1]), j[2], (0, 0, 255), 2)
                # draw the center of the circle
                cv2.circle(frame, (j[0], j[1]), 2, (0, 255, 0), 9)
                
                radius.append(circles[0][0][2])
     
       break 

    return frame

函数内部未定义的变量已经完成,但为了简单起见,我没有包括它们。

编辑:感谢评论,我做了一些修改,但问题仍然存在

编辑 2:代码工作正常,但在 cirlces return None.[=18= 时似乎是个问题]

我不能评论所以写在这里, 您的要求不是很清楚,首先 if 不是循环,其次我们无法理解何时打破 While 循环,我正在简化您的问题,这里是示例代码。

if circles is None: 
     radius.append(0)
     continue
else:
     break

在这种情况下 continue 也没有必要,因为在 if 之后 while

中没有更多代码到 运行

在回复之前,让我指出 if 命令指的是语句,而不是循环(更多信息 here

根据here

The continue statement is used to skip the rest of the code inside a loop for the current iteration only.

在您的特定情况下,当 if 语句的条件为真时,将值 0 附加到半径列表,然后继续 while 循环的下一次迭代。由于循环是 while True:,它会无限继续下去。 如果您想要实现的是在满足 if 语句的条件时退出循环,那么一种方法可能是使用 break 运算符而不是 continue 运算符。

我目前假设您只需要一个有效的 Hough 变换函数。 OpenCV 本身就有一个很好的例子。为 JavaC++python 提供解决方案:

Hough Transform

def hough(frame): 
    
    #calculate the median 
    medianFrame = np.median(randframes,axis=0).astype(dtype=np.uint8)
    grayMedianFrame = cv2.cvtColor(medianFrame, cv2.COLOR_BGR2GRAY)
    
    gframe = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #grayscale frame
    dframe = cv2.absdiff(gframe, grayMedianFrame)  #remove background

    blurred = cv2.GaussianBlur(dframe,(11,11),cv2.BORDER_DEFAULT)  #Gausian blur with standard deviation of 11

    circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT,1,120,param1= 50, param2=30,minRadius=0,maxRadius=0)
        
    if circles is None: 
        return [0]
    else: 
        circles = np.uint16(np.around(circles))
        output = []  
        for j in circles[0, :]: 
            
            # draw the outer circle
            cv2.circle(frame, (j[0], j[1]), j[2], (0, 0, 255), 2)
            # draw the center of the circle
            cv2.circle(frame, (j[0], j[1]), 2, (0, 255, 0), 9)
                
           output.append(circles[0][0][2])
    return output


## main program
radius = []
for frame in frames:
    radius.append(hough(frame))