C++ openCV:如何将视频分割成图像序列?
使用opencv,如何将视频分割成图像序列?C++ openCV:如何将视频分割成图像序列?,c++,c,video,opencv,video-capture,C++,C,Video,Opencv,Video Capture,使用opencv,如何将视频分割成图像序列? 如何将其拆分,使输出成为一系列图像?即使在我编辑之后,这个问题看起来更像是一个“向我发送代码”的要求,而不是一个典型的StackOverflow问题,即OP提供了详细信息,并证明他或她对此进行了一些真正的思考 所以我会给出一个“半答案”。。。无论如何,我只对OpenCV的机器学习模块略知一二,对库中的其他部分几乎一无所知 简而言之,伪代码应该是这样的,实现通常需要前面提到的OpenCV方法 myCapt = cvCreateFileCaptur
如何将其拆分,使输出成为一系列图像?即使在我编辑之后,这个问题看起来更像是一个“向我发送代码”的要求,而不是一个典型的StackOverflow问题,即OP提供了详细信息,并证明他或她对此进行了一些真正的思考 所以我会给出一个“半答案”。。。无论如何,我只对OpenCV的机器学习模块略知一二,对库中的其他部分几乎一无所知 简而言之,伪代码应该是这样的,实现通常需要前面提到的OpenCV方法
myCapt = cvCreateFileCapture("myInput.avi") // Assuming the feed is from a file.
while (there are frames and we still want them)
cvGrabFrame(myCapt)
myImg = cvRetrieveFrame(myCapt)
// alternatively to cvGrabFrame + cvRetrieveFrame, could use cvQueryFrame()
// save the file (or do something with it...)
cvSaveImage("some_file_name_with_seq_nr", myImage)
cvReleaseCapture(capture)
如上所述,需要进行大量语法和逻辑工作(例如,确定何时停止,生成各个帧的文件名,当然正确声明变量,并使用正确的间接级别w/所有这些指针;-)。当然,如果您使用Python接口,其中一些操作会变得更容易
,提供了有关各个方法的更详细信息。令我惊讶的是,我找不到有关StackoverFlow的这个问题的答案 我目前正在使用OpenCV 2.1。这可能有点旧,但它像一个魅力。该程序将读取一个输入文件,并在名为*frame_xx.jpg的当前文件夹上创建一系列图像*
#include <stdio.h>
#include <stdlib.h>
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
if (argc < 2)
{
printf("!!! Usage: ./program <filename>\n");
return -1;
}
printf("* Filename: %s\n", argv[1]);
CvCapture *capture = cvCaptureFromAVI(argv[1]);
if(!capture)
{
printf("!!! cvCaptureFromAVI failed (file not found?)\n");
return -1;
}
int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
printf("* FPS: %d\n", fps);
IplImage* frame = NULL;
int frame_number = 0;
char key = 0;
while (key != 'q')
{
// get frame
frame = cvQueryFrame(capture);
if (!frame)
{
printf("!!! cvQueryFrame failed: no frame\n");
break;
}
char filename[100];
strcpy(filename, "frame_");
char frame_id[30];
itoa(frame_number, frame_id, 10);
strcat(filename, frame_id);
strcat(filename, ".jpg");
printf("* Saving: %s\n", filename);
if (!cvSaveImage(filename, frame))
{
printf("!!! cvSaveImage failed\n");
break;
}
frame_number++;
// quit when user press 'q'
key = cvWaitKey(1000 / fps);
}
// free resources
cvReleaseCapture(&capture);
return 0;
}
#包括
#包括
#包括“cv.h”
#包括“highgui.h”
int main(int argc,字符**argv)
{
如果(argc<2)
{
printf(!!!用法:./program\n”);
返回-1;
}
printf(“*文件名:%s\n”,argv[1]);
CvCapture*capture=cvCaptureFromAVI(argv[1]);
如果(!捕获)
{
printf(!!!cvCaptureFromAVI失败(找不到文件?)\n);
返回-1;
}
int fps=(int)cvGetCaptureProperty(捕获,CV_CAP_PROP_fps);
printf(“*FPS:%d\n”,FPS);
IplImage*frame=NULL;
int frame_number=0;
字符键=0;
while(键!=“q”)
{
//获得框架
帧=cvQueryFrame(捕获);
如果(!帧)
{
printf(!!!cvQueryFrame失败:无帧\n”);
打破
}
字符文件名[100];
strcpy(文件名,“frame_”);
字符帧_id[30];
itoa(帧号,帧id,10);
strcat(文件名、帧id);
strcat(文件名为“.jpg”);
printf(“*保存:%s\n”,文件名);
如果(!cvSaveImage(文件名,帧))
{
printf(!!!cvSaveImage失败\n”);
打破
}
帧号++;
//当用户按“q”时退出
键=cvWaitKey(1000/fps);
}
//免费资源
cvReleaseCapture(&capture);
返回0;
}
@mero0o这是另一个完全不同的问题,取决于您使用的平台。我相信这个问题已经解决了。别忘了接受我的答案。@mero0o可能吧,但我不知道,因为我没有答案。试试看,如果不行,就转到2.1。小心,最新的OpenCV改变了很多,我的代码可能无法编译。此代码特定于2.1。顺便说一句,Google有很多结果显示了如何设置您的环境来编译OpenCV内容。看看这个:如果我下载opencv2.1,并且我有visualstudi 2008,那么这个如何工作呢?这样我就可以编写代码并运行它。你注意到在你的另一个线程上回答同样问题的也是我吗?我不会在这里重复我的答案。@karlphillip你经常使用opencv吗?只是好奇。。。我看到你在opencv上回答了很多问题:)