为什么opencv保存相同的图像?

时间:2015-01-09 04:16:07

标签: python opencv

我试图从相机捕捉图像并保存。我将在两者之间进行一些计算,但出于问题的目的,我并非如此。 (即doStuff()下方的行被评论)

问题在于我总是保存相同的图像而我不明白为什么。我似乎没有刷新内存缓冲区或类似的东西?

我尝试了示例from the docs,但效果很好。此外,在实际实施中,getFrame在不同的文件中定义并导入,但我认为这不重要。

任何帮助表示赞赏

import cv2
import time, datetime

def getFrame(cap, fn='image'):
    timeString = datetime.datetime.fromtimestamp(time.time()).strftime('%H_%M_%S_%Y_%m_%d')
    readSuccess, frame = cap.read()
    pn = os.getcwd() + '/Images/'
    if readSuccess:
        cv2.imwrite(pn+fn+'_'+timeString+'.png', frame)

cap = cv2.VideoCapture(0)
for ii in range(10):
    doStuff() # this doesn't really matter, I'm testing it with this line commented
    getFrame(cap) # <- this always saves the same image

修改

经过多次测试后:

它实际上并没有捕获相同的图像,但它似乎是 next 图像。接下来我的意思是,如果你认为这是一个实时流,它只是转移到下一个将被捕获的图像,以使其更清晰:

例如,如果它有10个图像缓冲区,则一旦运行.read,它将捕获紧密间隔的10个图像。因此,当我执行下一个.read命令时,它只返回先前捕获的图像并将一个添加到缓冲区。我在这里做了一些猜测,但我认为这就是正在发生的事情。这可以解释为什么上面的文档中的示例工作正常,这对于在实时流的情况下你想要的东西都是有意义的,但不是在我的情况下。

之前有没有人见过这种行为?解决方法?

EDIT2

我插入了以下代码:

for ii in range(10):
    cap.grab()

def getFrame(cap, fn='image'):行之后,并认为有效,但是我对此并不了解,但仍然不太了解它。我希望某人有(a)更好的解决方案,(b)可能是一个实际的解释,而不是我的估计。

谢谢!

1 个答案:

答案 0 :(得分:0)

似乎我的猜测是正确的,我发现这link与此answer同时遇到了同样的问题,而且类似的&#34; hack&#34;按照 EDIT2 中的建议使用。

如果我有时间我会改进答案,我认为不断阅读图像只保留我想要的图像可能是一个更好的解决方案,如果我有时间,我会写下来。< / p>