繁体   English   中英

Python输出会重复,即使它会中断

[英]Python output repeats even though it should break

我有一个使用OpenCV查找面孔的脚本,如果未找到面孔,它将输出“未找到面孔”,但它从不做任何其他事情。 它应该备份并要求其他图像。 谁能告诉我为什么在我按CTRL + C之前只打印“找不到面孔”?

def Crop(
    imagePattern,
    boxScale,
    outputimg,
    padding,
    ):
    happy = True
    imgList = glob.glob(imagePattern)
    while happy:
        if len(imgList) <= 0:
            return
        else:
            for img in imgList:
                pil_im = Image.open(img)
                cv_im = pil2cvGrey(pil_im)
                faces = DetectFace(cv_im, faceCascade)
                if faces:
                    n = 1
                    for face in faces:
                        croppedImage = imgCrop(pil_im, face[0],
                                padding, boxScale=boxScale)
                        (fname, ext) = os.path.splitext(img)
                        fname = os.path.basename(fname)
                        croppedImage.save(outputimg + '\\' + fname
                                + ' -c' + ext)
                        n += 1
                    print 'Cropping:', fname
                else:
                    print 'No faces found:', img
                    break

                            # Verify image
                            # savedPath = outputimg + '\\' + fname + ' -c' + ext
                            # verify = cv2.imread(savedPath, 0)
                            # cv2.imshow('Saved Image', verify)

                print 'Please open the file manually to view for now'
                print 'Are you happy with the final crop?'
                happyTest = raw_input('Enter y or n: ')
                happyTest = happyTest.strip()
                if happyTest == 'y':
                    happy = False
                elif happyTest == 'n':
                    padding = int(raw_input('Enter crop padding:'))
                else:
                    print 'Not a valid input'
    print 'Do you have more pictures to take?'
    again = raw_input('Enter y or n: ')
    if again == 'y':
        Webcam(webcam, padding, boxScale)
    else:
        print 'Closing application'
        time.sleep(3)
        raise SystemExit

很抱歉造成混淆,由于使用代码标签,我的复制/粘贴错误。

编辑:谢谢您让我知道有关混合选项卡和空格,但我的问题仍然是相同的。 使用中断还是继续也没关系。 我是否需要使用递归并再次调用该函数?

您正在使用break语句,该语句完全停止for循环。

相反,请在该处使用continue语句跳过当前图像,然后继续前进至for循环中的下一个图像。

了解更多关于break在此处 continue

另外,您正在使用制表符和空格聚集,这会导致块的缩进未对齐。 尽管它们看起来好像完全对齐,但是您将遇到噩梦,调试选项卡错误,因此只需更改编辑器设置以将选项卡用作4个空格即可。

编辑

您的代码中存在多个问题:

  1. 您正在检查len(imgList)<=0 ,这是多余的,正如其他答案中已经指出的那样。
  2. 您为imglist中的每个img都采用了happytest值,但是只有最后一次运行时输入的值才会影响happy变量的值。
  3. 由于上面的#2,我倾向于认为您的最初意图是在happy值为False任何运行中停止,这绝对不会在现在发生。
  4. 您正在使用大写字母和驼峰大小写来开始某些功能的名称,而我很难确定是公共类还是其他功能。
  5. 在代码中引用了多个外部函数,但是我对它们应该做什么以及它们是否实际执行了应做的事情并不了解。

我不知道这是否是问题,但无论如何是您发布它的方式:else语句后的命令不缩进。 它不应该给您一个错误吗?

您的代码break了-此版本应该可以运行:

for img in imgList:
    pil_im=Image.open(img)
    cv_im=pil2cvGrey(pil_im)
    faces=DetectFace(cv_im,faceCascade)
    if faces:
        n=1
        for face in faces:
            croppedImage=imgCrop(pil_im, face[0], padding, boxScale=boxScale)
            fname,ext=os.path.splitext(img)
            fname = os.path.basename(fname)
            croppedImage.save(outputimg + '\\' + fname + ' -c' + ext)
            n+=1
        print 'Cropping:', fname
    else:
        print 'No faces found:', img

因此,尽管在其他答案和注释上确实是您在else语句中没有“中断”的else ,但是您在问题中提出的问题却是因为您完全中断了:如果代码到达了else块,它只会脱离for img in imgList:循环中的for img in imgList:进行任何处理。

除此之外,我还修复了此代码中的其他两件事:缩进-在Python中这是严肃的事情,而不是“行之有效”。 建议每个块嵌套使用4个空格-不要多也不要少,并且永远不要将制表符和空格混合使用。 您必须在代码编辑器首选项上进行配置。

代码的另一部分与Python if len(imgList)<=0:则在循环之前进行验证if len(imgList)<=0:在Python中完全多余(更不用说<=部分):如果列表长度为零( (不能为负), for语句将尝试选择第一个项目,由于它不存在,因此该程序将在for块之后继续执行。 您在代码中减少的每个缩进级别都提高了可读性。 (Python的Zen甚至读到“ Flat比嵌套更好”)。 另一方面,如果您确实需要检查代码的其他部分,则lsit是否为空,只需检查imgList:, if imgList:中的序列具有很好的属性,如果它们为空,则具有False布尔值;以及否则为True

break已经编写跳出的for img in imgList:循环,而不是 while happy:循环。 而且,由于你的代码用来询问用户是否裁剪是令人满意的,是循环(与后内break ),它永远不会被达成(并因此happy永远不能设置False )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM