OpenCV~捕獲攝像頭 幀率fps和waitkey函式 問題
阿新 • • 發佈:2019-02-07
本文分析在使用OpenCV捕獲攝像頭時發現的兩個問題:
- 使用capture.get(CV_CAP_PROP_FPS)方法獲取幀率為0!
- waitKey()函式有幾個作用?改變它的引數大小會影響計算得到的FPS大小
分析:
- OpenCV中的fps只能在讀取視訊的時候獲得。如果是攝像頭,可根據fps的定義自己計算,網上也有人遇到過讀取攝像頭幀率為0的情況—部落格園。
- waitkey有兩個作用,且在imshow之後如果沒有waitKey語句則不能正常顯示影象。在下面給的實驗程式碼中計算fps意義不大,只可大致測試出攝像頭影象處理演算法的時間消耗,使用MFC或者QT這個時候的fps才有意義,這裡的fps是指遊戲中的影象
- It waits for x milliseconds for a key press. If a key was pressed during that time, it returns the key’s ASCII code. Otherwise, it returns -1.
- It handles any windowing events, such as creating windows with cv::namedWindow(), or showing images with cv::imshow().
waitkey函式的定義如下:
int cvWaitKey( int delay=0 )
返回值為int型,函式的引數為int型,當delay小於等於0的時候,如果沒有鍵盤觸發,則一直等待,此時的返回值為-1,否則返回值為鍵盤按下的碼字;當delay大於0時,如果沒有鍵盤的的觸發,則等待delay的時間,此時的返回值是-1,否則返回值為鍵盤按下的碼字。
附上程式碼:
#include <stdlib.h>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
int main(int argc, const char** argv)
{
cv::Mat frame;
// 可從攝像頭輸入視訊流或直接播放視訊檔案
cv::VideoCapture capture(0);
//cv::VideoCapture capture("vedio1.avi");
double fps;
char string[10]; // 幀率字串
cv::namedWindow("Camera FPS");
double t = 0;
while (1)
{
t = (double)cv::getTickCount();
if (cv::waitKey(1) == 1) { break; }
if (capture.isOpened())
{
capture >> frame;
// getTickcount函式:返回從作業系統啟動到當前所經過的毫秒數
// getTickFrequency函式:返回每秒的計時週期數
// t為該處程式碼執行所耗的時間,單位為秒,fps為其倒數
t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
fps = 1.0 / t;
sprintf_s(string, "%.2f", fps); // 幀率保留兩位小數
std::string fpsString("FPS:");
fpsString += string; // 在"FPS:"後加入幀率數值字串
printf("fps: %.2f width:%d height:%d fps:%.2f\n", fps, frame.cols, frame.rows, capture.get(CV_CAP_PROP_FPS));
// 將幀率資訊寫在輸出幀上
cv::putText(frame, // 影象矩陣
fpsString, // string型文字內容
cv::Point(5, 20), // 文字座標,以左下角為原點
cv::FONT_HERSHEY_SIMPLEX, // 字型型別
0.5, // 字型大小
cv::Scalar(0, 0, 0)); // 字型顏色
cv::imshow("Camera FPS", frame);
char c = cv::waitKey(30); //延時30毫秒
// 注:waitKey延時越長 fps越大 出現跳幀 攝像頭顯示變卡
if (c == 27) //按ESC鍵退出
break;
}
else
{
std::cout << "No Camera Input!" << std::endl;
break;
}
}
}