[英]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个空格即可。
编辑
您的代码中存在多个问题:
len(imgList)<=0
,这是多余的,正如其他答案中已经指出的那样。 happytest
值,但是只有最后一次运行时输入的值才会影响happy
变量的值。 False
任何运行中停止,这绝对不会在现在发生。 我不知道这是否是问题,但无论如何是您发布它的方式: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.