我有一个使用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
对于这种混淆感到抱歉,由于我使用了代码选项卡,我的复制/粘贴效果不佳。
编辑: 感谢您让我知道混音标签和空格,但我的问题仍然是一样的。如果我使用休息或继续也没关系。我是否需要使用递归并再次调用该函数?
答案 0 :(得分:3)
您正在使用break
语句,它会完全停止for
循环。
相反,在那里使用continue
语句跳过当前图像,然后转到for
循环中的下一个图像。
详细了解break
和continue
here
此外,您正在使用制表符和空格来收集,这会导致块的缩进未对齐。虽然它们看起来好像已经完全对齐,但是你会有噩梦调试标签错误,所以只需更改你的编辑器设置就可以使用一个标签作为4个空格。
修改的
您的代码中存在多个问题:
len(imgList)<=0
这是多余的,正如在其他答案中已经指出的那样。happytest
值,但只有在上次运行时输入的值才会影响happy
变量的值。False
,这绝对不会发生。答案 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 }})。