Python输出重复,即使它应该

2024-04-20 12:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它使用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

很抱歉造成混淆,我的代码使用了制表符,因此复制/粘贴不正确。你知道吗

编辑: 谢谢你让我知道混合标签和空间,但我的问题仍然是一样的。我是用休息还是继续也没关系。我需要使用递归并再次调用函数吗?你知道吗


Tags: imgforinputiffnameelseprinthappy
3条回答

您编码的breakfor img in imgList:循环中断,不是while happy:循环。由于用于询问用户裁剪是否令人满意的代码位于该循环内(并且在break之后),因此它永远无法到达(因此happy永远无法设置False)。你知道吗

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

您使用的是break语句,它完全停止for循环。你知道吗

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

阅读更多关于breakcontinuehere

另外,您将制表符和空格一起使用,这会导致块的缩进未对齐。虽然它们看起来好像对齐得很好,但调试选项卡错误会让人噩梦,所以只需更改编辑器设置,将选项卡用作4个空格。你知道吗

编辑

代码中存在多个问题:

  1. 您正在检查len(imgList)<=0,正如在其他答案中已经指出的那样,它是多余的。你知道吗
  2. 对于imglist中的每个img,都采用您采用的happytest值,但是只有在上次运行时输入的值才会影响happy变量的值。你知道吗
  3. 因为上面的#2,我倾向于认为你的初衷是在任何快乐的价值是False的跑步中停下来,而现在绝对不会发生这种情况。你知道吗
  4. 您使用大写字母和camel case来开始一些函数的名称,而我很难判断某个函数是公共类还是其他函数。你知道吗
  5. 代码中引用了多个外部函数,但是我不太清楚它们应该做什么,以及它们是否真的做了它们应该做的事情。你知道吗

相关问题 更多 >