1. 程式人生 > >【opencv學習筆記】一. 網路攝像頭視訊儲存

【opencv學習筆記】一. 網路攝像頭視訊儲存

目標:將網路攝像頭的視訊流儲存在電腦中

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <iostream>  

using namespace cv;
using namespace std;

int main(int, char**) {
	VideoCapture cam;
	Mat frame;

//儲存網路視訊流地址
	const string videoStreamAddress = "http://xxx.xxx.xxx.xxx/xxxx.mjpg"; //視訊地址根據個人情況改變

//檢測該視訊流是否能被開啟,若失敗直接退出程式
	if (!cam.open(videoStreamAddress)) {
		cout << "échec à connecter IPcaméra" << endl;
		getchar();
		return -1;
	}
//獲取一幀用於提取影象大小
	cam >> frame;
//建立視訊儲存檔案
	VideoWriter video((const string)"v1.avi", CV_FOURCC('D', 'I', 'V', 'X'), cam.get(CV_CAP_PROP_FPS), Size(frame.cols, frame.rows));
//檢測檔案建立是否成功
	if (video.isOpened()) cout << "création du fichier réussie" << endl;
//儲存視訊檔案,我們想錄一段約2分鐘的視訊,而視訊速度為25FPS,因此記錄3000幀
	
	for (int i = 0;i<3000;) {
		//檢測下一幀是否為空,為空不儲存影象
		if (!cam.read(frame)) {
			cout << "aucun frame" << endl;
			waitKey();
		}
		else{
		video.write(frame);
		imshow("Output Window", frame);
		waitKey(1);
		i++;
		}
	}
	cam.release();
	return 0;
}


測試結果視訊儲存正常可以順利播放,除了程式實際執行時間約為計算出的2分鐘(3000 幀 /25 fps /60 秒/分 = 2分鐘)的兩倍長,我將提取幀數改為200嘗試發現程式執行時間依然為八秒的兩倍左右,而且儲存的視訊以25fps播放起來的時候速度明顯偏快,猜測可能是從視訊流裡面獲取的幀率資訊與實際幀率有誤差。