1. 程式人生 > >OpenCV~捕獲攝像頭 幀率fps和waitkey函式 問題

OpenCV~捕獲攝像頭 幀率fps和waitkey函式 問題

本文分析在使用OpenCV捕獲攝像頭時發現的兩個問題:

  1. 使用capture.get(CV_CAP_PROP_FPS)方法獲取幀率為0!
  2. waitKey()函式有幾個作用?改變它的引數大小會影響計算得到的FPS大小

分析:

  1. OpenCV中的fps只能在讀取視訊的時候獲得。如果是攝像頭,可根據fps的定義自己計算,網上也有人遇到過讀取攝像頭幀率為0的情況—部落格園
  2. waitkey有兩個作用,且在imshow之後如果沒有waitKey語句則不能正常顯示影象。在下面給的實驗程式碼中計算fps意義不大,只可大致測試出攝像頭影象處理演算法的時間消耗,使用MFC或者QT這個時候的fps才有意義,這裡的fps是指遊戲中的影象
    重新整理率
    是衡量遊戲效能的一個指標。
  1. 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.
  2. 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; } } }