微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

批量仅读取/保存文件夹中的最后一张图像

如何解决批量仅读取/保存文件夹中的最后一张图像

我正在尝试将批处理添加到正在制作的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)

解决方法

我在代码中进行了多次更正

    1. 您需要提供haarcascade_frontalface_default.xml的完整路径

    例如:在Unix系统中:

    cascPath = 'opencv/data/haarcascades/haarcascade_frontalface_default.xml'
    
    1. 您不应在循环期间创建目录。您应该在循环之前创建它。
    if not os.path.exists('output'):
      os.makedirs('output')
    
    1. 您无需更改目录即可保存图像。只需在图像之前添加路径即可。
    img_name = "output/out_{}.png".format(c) # c is the counter  
    
    1. 缩进很重要,否则,您可能会遇到困难。

示例代码:

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)

示例输出:

enter image description here

,
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 举报,一经查实,本站将立刻删除。