第一種方法:
int main(int argc, char** argv)
{
cvNamedWindow("視頻播放器", CV_WINDOW_AUTOSIZE);
//參數可以是設備的索引號,或者是一個視頻文件。設備索引號就是在指定要使用的攝像頭。
//一般的筆記本電腦都有內置攝像頭。所以參數就是 0。你可以通過設置成 1 或者其他的來選擇別的攝像頭。
// 用cvCaptureFromAVI()跟cvCaptureFromFile()、cvCreateFileCapture()都是一樣的作用
CvCapture* capture = cvCreateFileCapture(".\\video1.mp4"); //獲取視頻
IplImage* frame;
int i = 0;
char image_name[25];
int pos = 0;
int pos1 = 0;
while (1)
{
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, pos);
cout << pos; frame = cvQueryFrame(capture); //獲取一幀圖片,將其顯示
pos1 = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);
cout << "\t" << pos1 << endl;
if (!frame) break;
cvShowImage("視頻播放器", frame); //顯示每一幀
sprintf(image_name, "%s%.4d%s", ".\\tutu15\\", ++i, ".jpg");//保存的圖片名
cvSaveImage(image_name, frame); //保存一幀圖片
char c = cvWaitKey(33);
if (c == 27) break;
pos += 12; // 快進,每隔12幀顯示一幀圖片
}
cvReleaseCapture(&capture);
cvDestroyWindow("視頻播放器");
system("pause");
}
第二種方法:
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
void main()
{
//VideoCapture capture(0);
VideoCapture capture("video1.mp4");
Mat frame;
if (capture.isOpened()) //判斷視頻是否成功打開
{
while (capture.grab()) //capture.grab() 從視頻文件或捕獲設備中抓取下一個幀,假如調用成功返回true。
{
capture >> frame;
frame = findTargetImg(frame);
if (cvWaitKey(20) == 27) //資料說明,在顯示圖像的時候,每秒顯示27、28幀的時候,我們看到的視頻是流暢的
{
break;
}
}
}
waitKey(0);
}
第三種方法:
using namespace cv;
int main(int argc,char *argv[])
{
VideoCapture cap(0);//打開默認的攝像頭
if(!cap.isOpened())
{
return -1;
}
Mat frame;
bool stop = false;
while(!stop)
{
cap.read(frame); // 或cap>>frame;
imshow("Video",frame);
if(waitKey(30)==27) //Esc鍵退出
{
stop = true;
}
}
return 0;
}