Python 使用不同的名称在循环中保存图像

Python 使用不同的名称在循环中保存图像,python,opencv,Python,Opencv,我在循环保存裁剪的图像时遇到问题。我的代码: def run(self, image_file): print(image_file) cap = cv2.VideoCapture(image_file) while(cap.isOpened()): ret, frame = cap.read() if ret == True: img = frame min_h = int(max(img.

我在循环保存裁剪的图像时遇到问题。我的代码:

def run(self, image_file):
    print(image_file)
    cap = cv2.VideoCapture(image_file)
    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret == True:
            img = frame
            min_h = int(max(img.shape[0] / self.min_height_dec, self.min_height_thresh))
            min_w = int(max(img.shape[1] / self.min_width_dec, self.min_width_thresh))
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = self.face_cascade.detectMultiScale(gray, 1.3, minNeighbors=5, minSize=(min_h, min_w))

            images = []
            for i, (x, y, w, h) in enumerate(faces):
                images.append(self.sub_image('%s/%s-%d.jpg' % (self.tgtdir, self.basename, i + 1), img, x, y, w, h))
            print('%d faces detected' % len(images))

            for (x, y, w, h) in faces: 
                self.draw_rect(img, x, y, w, h)
                # Fix in case nothing found in the image
            outfile = '%s/%s.jpg' % (self.tgtdir, self.basename)
            cv2.imwrite(outfile, img)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break
    cap.release()
    cv2.destroyAllWindows()
    return images, outfile

我对每个帧都有一个循环,在面上进行裁剪。问题是,对于每一个裁剪过的图像和图片,它都给出了相同的名称,最终我只有最后一帧的人脸。如何修复此代码以保存所有裁剪的面和图像?

您可以使用
datetime
模块以毫秒精度获取当前时间,以避免名称冲突,在将图像保存为之前分配名称:

from datetime import datetime

outfile = '%s/%s.jpg' % (self.tgtdir, self.basename + str(datetime.now()))
cv2.imwrite(outfile, img)

您还可以使用其他技术,如
uuid4
为每个帧获取唯一的随机id,但由于名称是随机的,因此在某些平台上按排序顺序显示它们会很麻烦,因此我认为在名称中使用时间戳可以完成您的工作。

您使用相同的名称保存每个文件。因此,您将覆盖以前保存的图像

outfile = '%s/%s.jpg' % (self.tgtdir, self.basename)
将行更改为该行以在名称中添加随机字符串

outfile = '%s/%s.jpg' % (self.tgtdir, self.basename + str(uuid.uuid4()))
您还需要在文件顶部导入uuid

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
i = 0

while(True):
    # Capture frame-by-frame
    i = i +1
    ret, frame = cap.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# Display the resulting frame
cv2.imshow('frame',frame)
**cv2.imwrite("template {0}.jpg".format(i),gray)**


if cv2.waitKey(0) & 0xFF == ord('q'):
    break

cap.release()
cv2.destroyAllWindows()

---rohbhot编写的代码

我认为这将有助于

import cv2

vid = cv2.VideoCapture("video.mp4")
d = 0
ret, frame = vid.read()

while ret:
    ret, frame = vid.read()
    filename = "images/file_%d.jpg"%d
    cv2.imwrite(filename, frame)
    d+=1

这将使用不同的名称保存每个帧。

对我很有用,谢谢