OpenCV2學習筆記(十八):顯示視頻流的幀率,opencv2學習筆記
最近做一個東西,需要在視頻上即時顯示幀速,即FPS。FPS是Frame Per Second的縮寫,中文意思是每秒畫面格數。開發平台為VS2013+OpenCV2.4.9。
FPS是測量用於儲存、顯示動態視頻的資訊數量。通俗來講就是指每秒變化的畫面數。
在計算FPS時,需要使用的主要函數有getTickCount、getTickFrequency。而在輸出映像上顯示FPS浮水印則是使用函數putText,他們的簡單聲明如下:
GetTickCount(void); 在Debug版本中,裝置啟動後便從計時器中減去180秒。這樣方便測試使用該函數的代碼的正確溢出處理。在Release版本中,該函數從0開始計時,返回自裝置啟動後的毫秒數(不含系統暫停時間)。
getTickFrequency函數:返回每秒的計時周期數,GetTickCount / getTickFrequency就得到一個周期的時間。
void putText(Mat& img, // 映像矩陣 const string& text, // string型內容 Point org, // 字串的座標,以左下角為原點 int fontFace, // 字型類型 double fontScale, // 字型大小 Scalar color, // 字型顏色 int thickness = 1, // 字型粗細 int lineType = 8, // 直線類型 bool bottomLeftOrigin = false) // 尚不知是什麼功能
如果想得到一段程式的已耗用時間,可以套用下面的例子:
t = (double)cv::getTickCount();if (capture.isOpened()){ capture >> frame; // getTickcount函數:返回從作業系統啟動到當前所經過的毫秒數 // getTickFrequency函數:返回每秒的計時周期數 // t為該處代碼執行所耗的時間,單位為秒,fps為其倒數 t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); fps = 1.0 / t;
實現顯示視訊框架率的簡單代碼:
#include <stdlib.h>#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>void main(){ cv::Mat frame; // 可從網路攝影機輸入視頻流或直接播放視頻檔案 //cv::VideoCapture capture(0); cv::VideoCapture capture("e:/VIDEO0002.mp4"); double fps; char string[10]; // 用於存放幀率的字串 cv::namedWindow("Camera FPS"); double t = 0; while (1) { t = (double)cv::getTickCount(); if (cv::waitKey(50) == 30){ break; } if (capture.isOpened()) { capture >> frame; // getTickcount函數:返回從作業系統啟動到當前所經過的毫秒數 // getTickFrequency函數:返回每秒的計時周期數 // t為該處代碼執行所耗的時間,單位為秒,fps為其倒數 t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); fps = 1.0 / t; sprintf(string, "%.2f", fps); // 幀率保留兩位小數 std::string fpsString("FPS:"); fpsString += string; // 在"FPS:"後加入幀率數值字串 // 將幀率資訊寫在輸出幀上 putText(frame, // 映像矩陣 fpsString, // string型文字內容 cv::Point(5, 20), // 文字座標,以左下角為原點 cv::FONT_HERSHEY_SIMPLEX, // 字型類型 0.5, // 字型大小 cv::Scalar(0, 0, 0)); // 字型顏色 cv::imshow("Camera FPS", frame); } else { std::cout << "No Camera Input!" << std::endl; break; } }}
以上這段程式可以大致測試出視頻處理演算法的時間消耗。主要過程是使用以上兩個主要函數得到每幀之間的時間,再用putText把FPS的數值顯示到螢幕上。
參考資料:http://www.cnblogs.com/jxsoft/archive/2011/10/17/2215366.html
http://blog.csdn.net/boksic/article/details/7017837