#include "opencv2/opencv.hpp"
#pragma comment (lib , "opencv_core244d.lib")
#pragma comment (lib ,"opencv_highgui244d.lib")
#pragma comment(lib , "opencv_imgproc244d.lib")
int main(int argc, char* argv[])
{
CvCapture* capture = cvCaptureFromFile("try.avi");
IplImage* frame = NULL;
do
{
frame = skipNFrames(capture, 1);
cvNamedWindow("frame", CV_WINDOW_AUTOSIZE);
cvShowImage("frame", frame);
cvWaitKey(0);
} while( frame != NULL );
cvReleaseCapture(&capture);
cvDestroyWindow("frame");
cvReleaseImage(&frame);
return 0;
}
这是我从视频中获取帧的程序,但是当我运行此程序时,它可以工作,它会显示视频,但它不会自动保存帧(不使用任何按钮或鼠标),这应保存在我的目录
答案 0 :(得分:3)
要查看视频的每个帧,请分别使用cvWaitKey(0)
。它显示视频的当前帧并等待无限按键。所以要看下一帧按键。
答案 1 :(得分:3)
单独保存每个帧,
#include<stdio.h>
声明全局变量
int flag=0;
将以下代码添加到 cvWaitKey(0):
char *str=new char[50];
flag++;
sprintf(str,"%d",flag);
strcat(str," frame");
strcat(str,".jpg");
Mat image=frame;
imwrite(str,image);
答案 2 :(得分:2)
#include"stdafx.h"
#include<cv.h>
#include<highgui.h>
#include<cxcore.h>
int main(int argc, char* argv[]) {
int c=1;
IplImage* img=0;
char buffer[1000];
CvCapture* cv_cap = cvCaptureFromFile("try.avi");
cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);
while(1) {
img=cvQueryFrame(cv_cap);
cvShowImage("Video",img);
sprintf(buffer,"D:/image%u.jpg",c);
cvSaveImage(buffer,img);
c++;
if (cvWaitKey(100)== 27) break;
}
cvDestroyWindow("Video");
return 0;
}
试试这个,这将有效
答案 3 :(得分:0)
您需要使用cvSaveImage()
明确保存每个框架
这应该在您的循环中完成,无论您想要保存框架
显然,如果要使用不同的名称保存每个帧,则必须为每个调用生成不同的名称。 @baban展示了一种方法。