使用OpenCV和Python保存多个图像

3

我正在使用OpenCV和Python拍摄图像。但目前我只能一次拍摄一张照片。我希望能够让OpenCV拍摄多张照片。这是我的当前代码。

import cv2.cv as cv
import time

cv.NamedWindow("camera", 1)

capture = cv.CaptureFromCAM(0)

while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    cv.SaveImage('pic.jpg', img)
    if cv.WaitKey(10) == 27:
        break 
4个回答

3
您的代码覆盖了一个文件。每次保存到不同的文件中。 例如:
import cv2.cv as cv
import time

cv.NamedWindow("camera", 1)

capture = cv.CaptureFromCAM(0)

i = 0
while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    cv.SaveImage('pic{:>05}.jpg'.format(i), img)
    if cv.WaitKey(10) == 27:
        break
    i += 1

这很完美,但当我运行它时,它一直在拍照。有没有办法只拍5张照片? - ng150716
1
然еҗҺпјҢдёҚиҰҒдҪҝз”ЁWhile True:пјҢиҖҢжҳҜдҪҝз”Ёfor i in range(5):гҖӮ - falsetru
是的,那解决了问题。但它只会创建5个图像,然后不断地覆盖相同的5个文件。 - ng150716
你在评论中问了一个问题:“有没有办法只拍摄5张照片?” - falsetru
如果您想在每次运行时防止覆盖,请使用文件名而非简单计数器(例如时间戳)。 - falsetru

3
基于C++绑定接口的最小示例,展示您想要实现的内容。
import cv2

cpt = 0
maxFrames = 5 # if you want 5 frames only.

try:
    vidStream = cv2.VideoCapture(0) # index of your camera
except:
    print "problem opening input stream"
    sys.exit(1)

while cpt < maxFrames:
    ret, frame = vidStream.read() # read frame and return code.
    if not ret: # if return code is bad, abort.
        sys.exit(0)
    cv2.imshow("test window", frame) # show image in window
    cv2.imwrite("image%04i.jpg" %cpt, frame)
    cpt += 1

以下是一个完整的脚本示例,能够从摄像机索引或文件中读取数据。包括一些故障保护和有关读取设备的信息。

使用方法:record.py [源] [目标文件夹]

#!/usr/bin/env python
import cv2
import sys
import os

cpt = 0
maxFrames = 30

try:
    targetDir = sys.argv[2]
except:
    targetDir = "" # if no argument, then use current directory

try: # read input. eval if to transform video index to int
    vidStream = cv2.VideoCapture(eval(sys.argv[1]))
except:
    print "problem opening input stream"
    sys.exit(1)
if not vidStream.isOpened():
    print "capture stream not open"
    sys.exit(1)

# informations in case the input is a video file.
nFrames = vidStream.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
print "frame number: %s" %nFrames
fps = vidStream.get(cv2.cv.CV_CAP_PROP_FPS)
print "FPS value: %s" %fps

# note that we could use frame number here, or "while 1"
# so we could read from a live written file or capture devide.
while cpt < maxFrames:
    ret, frame = vidStream.read() # read frame and return code.
    if not ret:
        print "end of stream"
        sys.exit(0)
    cv2.imshow("test window", frame) # show image in window
    cv2.imwrite(os.path.join(targetDir, "image_%04i.jpg" %cpt), frame)
    cpt += 1
    keyPressed = cv2.waitKey(1) # time to wait between frames
    if keyPressed != -1: # if user pressed a key, stop recording.
        sys.exit(0)

2

我认为这将会很有帮助...

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

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

2
将要保存的图像名称更改为“[图像名称] [循环后递增的数字]”,这样可以确保每次循环后图像使用新名称保存,否则所有图像将覆盖相同的名称!
import cv2.cv as cv
import time

cv.NamedWindow("camera", 1)

capture = cv.CaptureFromCAM(0)
num = 0
while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    cv.SaveImage('pic'+str(num)+'.jpg', img)
    if cv.WaitKey(10) == 27:
        break
    num += 1

现在你的图片将会被保存为pic0.jpg,pic1.jpg,pic2.jpg等等..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接