OpenCV2學習筆記(十八):顯示視頻流的幀率,opencv2學習筆記

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.