Python输出重复,即使它应该破坏

时间:2014-03-12 01:44:55

标签: python python-2.7

我有一个使用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

对于这种混淆感到抱歉,由于我使用了代码选项卡,我的复制/粘贴效果不佳。

编辑: 感谢您让我知道混音标签和空格,但我的问题仍然是一样的。如果我使用休息或继续也没关系。我是否需要使用递归并再次调用该函数?

4 个答案:

答案 0 :(得分:3)

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

相反,在那里使用continue语句跳过当前图像,然后转到for循环中的下一个图像。

详细了解breakcontinue here

此外,您正在使用制表符和空格来收集,这会导致块的缩进未对齐。虽然它们看起来好像已经完全对齐,但是你会有噩梦调试标签错误,所以只需更改你的编辑器设置就可以使用一个标签作为4个空格。

修改

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你的代码上有一个极值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

所以,虽然在其他答案和评论中都是如此,但你不应该有&#34;打破&#34;在else声明中 - 您提出的问题就出现了问题,因为您完全没有这个问题:如果代码到达else阻止,它就会突破for img in imgList:循环并进一步处理。

除此之外,我在此代码中修复了另外两件事: 缩进 - 在Python中它是严肃的事业,而不是&#34;什么工作很好&#34;。建议是每块嵌套使用4个空格 - 不多也不少,永远不要混合制表符和空格。您必须在代码编辑器首选项上配置它。

与Python不同的代码的另一部分是循环之前的验证 if len(imgList)<=0:在Python中是多余的(更不用说<=部分):如果列表长度为零(它不能为负),for语句将尝试选择第一个项目,因为它不存在,程序将在for块之后继续。您在代码中减少的每个级别的缩进都是可读性的奖励。 (Python的Zen甚至读取&#34; Flat优于嵌套&#34;)。另一方面,如果在代码的其他部分你真的需要检查lsit是否为空,只需执行if imgList:,因为Python中的序列具有False布尔值的良好属性如果它们是空的,否则True

答案 3 :(得分:0)

您编码的break突然出现for img in imgList:循环, while happy:循环。而且,由于用于询问用户裁剪是否令人满意的代码是在该循环内(并且在break之后),因此永远不会到达(因此happy永远不会被设置{{1 }})。