如何解决批量仅读取/保存文件夹中的最后一张图像
我正在尝试将批处理添加到正在制作的OpenCV python脚本中,我一生无法看到自己在做什么错。我是一个初学者,所以可能有点愚蠢。最后,我希望脚本读取脚本当前工作目录中的每个图像文件,然后基于面部图像从openCV中进行裁剪,并将这些具有相同名称的裁剪图像输出到CWD内的文件夹中。现在,它所做的全部只是将文件夹中的最后一张图像输出到输出文件夹中。知道自己在做什么的人有什么想法吗?
import cv2
import sys
import os.path
import glob
#Cascade path
cascPath = 'haarcascade_frontalface_default.xml'
# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)
# Read Images
images = glob.glob('*.jpg')
for i in images:
image = cv2.imread(i,1)
#Convert to grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# Find face(s) using cascade
faces = faceCascade.detectMultiScale(
gray,scaleFactor=1.1,#size of groups
minNeighbors=5,#How many groups around are detected as face for it to be valid
minSize=(300,300) #Min size in pixels for face
)
# Outputs number of faces found in image
print('Found {0} faces!'.format(len(faces)))
# Places a rectangle on face (For debugging,wont be in crop version)
for (x,y,w,h) in faces:
cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,255),4)
# Resizes image to fit monitor and displayes it
imOut = cv2.resize(image,(750,1142))
#cv2.imshow("Faces found",ims)
#cv2.waitKey(0)
#Saves image to output folder and creates folder if it doesnt exist
if not os.path.exists('output'):
os.makedirs('output')
os.chdir('output')
cv2.imwrite(i,imOut)
解决方法
我在代码中进行了多次更正
-
- 您需要提供
haarcascade_frontalface_default.xml
的完整路径
例如:在Unix系统中:
cascPath = 'opencv/data/haarcascades/haarcascade_frontalface_default.xml'
- 您需要提供
-
- 您不应在循环期间创建目录。您应该在循环之前创建它。
if not os.path.exists('output'): os.makedirs('output')
-
- 您无需更改目录即可保存图像。只需在图像之前添加路径即可。
img_name = "output/out_{}.png".format(c) # c is the counter
-
- 缩进很重要,否则,您可能会遇到困难。
示例代码:
import cv2
import os.path
import glob
# Cascade path
cascPath = '/opencv/data/haarcascades/haarcascade_frontalface_default.xml'
# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)
if not os.path.exists('output'):
os.makedirs('output')
# Read Images
images = glob.glob('images/*.jpg')
for c,i in enumerate(images):
image = cv2.imread(i,1)
# Convert to grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# Find face(s) using cascade
faces = faceCascade.detectMultiScale(
gray,scaleFactor=1.1,# size of groups
minNeighbors=5,# How many groups around are detected as face for it to be valid
minSize=(300,300) # Min size in pixels for face
)
# Outputs number of faces found in image
print('Found {0} faces!'.format(len(faces)))
# Places a rectangle on face (For debugging,wont be in crop version)
for (x,y,w,h) in faces:
cv2.rectangle(image,(x,y),(x + w,y + h),(255,255,255),4)
if len(faces) > 0:
# Resizes image to fit monitor and displayes it
imOut = cv2.resize(image,(750,1142))
# cv2.imshow("Faces found",imS)
# cv2.waitKey(0)
# Saves image to output folder and creates folder if it doesnt exist
# os.chdir('output')
img_name = "output/out_{}.png".format(c)
cv2.imwrite(img_name,imOut)
示例输出:
,images = glob.glob('*.jpg')
for i in images:
image = cv2.imread(i,1)
#Convert to grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
...
您正在做的是:一张一张地打开每个图像,当到达最后一张图像时,对最后一张图像进行操作。
如果仅将要应用于一个图像的所有操作都包括在第一个for循环中,则可以轻松解决此问题。注意缩进,这基本上就是您在这里做错的事情。
images = glob.glob('*.jpg')
for i in images:
image = cv2.imread(i,1)
#Convert to grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#do all your operations here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。