我在循环中保存裁剪的图像时遇到问题。我的代码:
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
我的每个帧都有一个循环,在脸上进行裁剪。问题是,对于每个裁剪的图像和图片,它给出相同的名称,最后我只有最后一帧的面孔。我该如何修复此代码以保存所有裁剪的面部和图像?
答案 0 :(得分:3)
您正在使用相同的名称保存每个文件。因此,您将覆盖以前保存的图像
outfile = '%s/%s.jpg' % (self.tgtdir, self.basename)
将行更改为此项以在名称
中添加随机字符串outfile = '%s/%s.jpg' % (self.tgtdir, self.basename + str(uuid.uuid4()))
您还需要在文件顶部import uuid
答案 1 :(得分:2)
您可以使用datetime
模块以毫秒精度获取当前时间,以避免名称冲突,在保存图像之前指定名称:
from datetime import datetime
outfile = '%s/%s.jpg' % (self.tgtdir, self.basename + str(datetime.now()))
cv2.imwrite(outfile, img)
您还可以使用其他技术(例如uuid4
)为每个帧获取唯一的随机ID,但由于名称是随机的,因此在某些平台上以排序顺序显示它们会很麻烦所以我认为使用时间戳在名义上将完成你的工作。
答案 2 :(得分:1)
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
答案 3 :(得分:1)
我认为这会有所帮助...
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
这将以不同的名称保存每一帧。