2013-03-14 112 views
0

我想保存一段视频。我尝试在视觉C++ 2010中使用CvsaveImage(),但它无法保存很多帧,因为我不知道如何使用不同的名称保存下一帧。所以,旧的框架将被下一个覆盖。如何保存视频的任何帧

任何人都可以帮我保存很多不同名称的帧吗?

+0

使用计数器或系统时间生成唯一的(和可排序的)文件名。 – 2013-03-14 15:48:41

+0

感谢您的回答,您能解释更多细节吗? – 2013-03-15 17:42:17

回答

0

使用计数器,例如每次保存新文件时增加的帧数或整数。在文件名的末尾附加这个计数器的值,你会得到一个唯一的文件名,直到计数器溢出为止(一个无符号整数超过40亿帧)。

static unsigned int counter = 0; 
[...] 
char pFileName[MAX_PATH] = {0}; 
sprintf(pFileName, "<YourFilePath>\\Frame_%u.jpg", counter++); 
[...] 
+0

感谢回答,我可以弄明白。但问题是,如何添加计数器的值,因为在'cvsaveImage()',文件名是一个const *字符: 'INT cvSaveImage( 为const char *文件名, 常量CvArr *图像 );' – 2013-03-15 17:17:53

+0

例如,您可以使用sprintf()。 – cedrou 2013-03-15 17:22:13

+0

非常感谢你,它工作正常。 – 2013-03-16 08:04:36

0

cvSaveImage()需要const char* filename,但这只是意味着cvSaveImage不会改变串;这并不意味着不能改变它。

如果是简单的,你可以用自己的功能包cvSaveImage并在那里形成的文件名:

int my_cvSaveImage(const char* baseFilename, int frameNumber, const CvArr* image) 
{ 
    char filename[MAX_PATH] = {}; 
    sprintf(filename, "%s-%d.jpg", baseFilename, frameNumber); 
    return cvSaveImage(filename, image); 
} 

现在你骂:

my_cvSaveImage("file", 1, image); 
//... 
my_cvSaveImage("file", 2, image); 
+0

非常感谢你,它的工作:) – 2013-03-16 07:57:25