C++ 测量OpenCV FPS
我正在寻找一种测量openCV FPS的正确方法。我找到了好几种方法。但是没有一个适合我 我测试的第一个使用time\t start和time\t end。我认为一个是错误的,一旦它返回一个转储函数作为fps x time plot(我真的无法想象fps plot怎么会是转储函数) 这里是这个情节的图像 我测试的第二个使用t=(double)cvGetTickCount()来测量fps。这种方法在返回120 fps结果时是错误的,但是,对于以120 fps捕获的30秒长的视频,处理时间不应超过1分钟。所以这是一种错误的测量FPS的方法C++ 测量OpenCV FPS,c++,opencv,C++,Opencv,我正在寻找一种测量openCV FPS的正确方法。我找到了好几种方法。但是没有一个适合我 我测试的第一个使用time\t start和time\t end。我认为一个是错误的,一旦它返回一个转储函数作为fps x time plot(我真的无法想象fps plot怎么会是转储函数) 这里是这个情节的图像 我测试的第二个使用t=(double)cvGetTickCount()来测量fps。这种方法在返回120 fps结果时是错误的,但是,对于以120 fps捕获的30秒长的视频,处理时间不应超过
for(;;)
{
clock_t start=CLOCK();
Mat frame, finalFrame;
capture >> frame;
finalFrame = frame;
cvtColor(frame, frame, CV_BGR2GRAY);
GaussianBlur(frame, frame, Size(7,7), 1.5, 1.5);
threshold(frame, frame, 20, 255, CV_THRESH_BINARY);
dilate(frame, frame, Mat(), Point(-1, -1), 2, 1, 1);
erode(frame, frame, Mat(), Point(-1, -1), 2, 1, 1);
Canny(frame, frame, 20, 20*2, 3 );
vector<Vec3f> circles;
findContours(frame,_contours,_storage,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE );
vector<vector<Point> > contours_poly( _contours.size() );
vector<Rect> boundRect( _contours.size() );
vector<Point2f>center( _contours.size() );
vector<float>radius( _contours.size() );
int temp = 0;
for( int i = 0; i < _contours.size(); i++ )
{
if( _contours[i].size() > 100 )
{
approxPolyDP( Mat(_contours[i]), contours_poly[i], 3, true );
boundRect[i] = boundingRect( Mat(_contours[i]) );
minEnclosingCircle( (Mat)_contours[i], center[i], radius[i] );
temp = i;
break;
}
}
double dur = CLOCK()-start;
printf("avg time per frame %f ms. fps %f. frameno = %d\n",avgdur(dur),avgfps(),frameno++ );
frameCounter++;
if(frameCounter == 3600)
break;
if(waitKey(1000/120) >= 0) break;
}
有人知道在openCV中测量FPS的另一种方法吗
另外,我试图在视频的每一帧中找到圆圈。视频帧大小为320x240像素
更新2
我试图测量FPS的代码
for(;;)
{
clock_t start=CLOCK();
Mat frame, finalFrame;
capture >> frame;
finalFrame = frame;
cvtColor(frame, frame, CV_BGR2GRAY);
GaussianBlur(frame, frame, Size(7,7), 1.5, 1.5);
threshold(frame, frame, 20, 255, CV_THRESH_BINARY);
dilate(frame, frame, Mat(), Point(-1, -1), 2, 1, 1);
erode(frame, frame, Mat(), Point(-1, -1), 2, 1, 1);
Canny(frame, frame, 20, 20*2, 3 );
vector<Vec3f> circles;
findContours(frame,_contours,_storage,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE );
vector<vector<Point> > contours_poly( _contours.size() );
vector<Rect> boundRect( _contours.size() );
vector<Point2f>center( _contours.size() );
vector<float>radius( _contours.size() );
int temp = 0;
for( int i = 0; i < _contours.size(); i++ )
{
if( _contours[i].size() > 100 )
{
approxPolyDP( Mat(_contours[i]), contours_poly[i], 3, true );
boundRect[i] = boundingRect( Mat(_contours[i]) );
minEnclosingCircle( (Mat)_contours[i], center[i], radius[i] );
temp = i;
break;
}
}
double dur = CLOCK()-start;
printf("avg time per frame %f ms. fps %f. frameno = %d\n",avgdur(dur),avgfps(),frameno++ );
frameCounter++;
if(frameCounter == 3600)
break;
if(waitKey(1000/120) >= 0) break;
}
(;;)的
{
时钟启动=时钟();
垫架,最终架;
捕获>>帧;
最终帧=帧;
CVT颜色(边框、边框、CV_BGR2GRAY);
GaussianBlur(框架,框架,大小(7,7),1.5,1.5);
阈值(帧,帧,20,255,CV_THRESH_二进制);
扩张(框架,框架,垫(),点(-1,-1),2,1,1);
腐蚀(框架,框架,垫(),点(-1,-1),2,1,1);
Canny(帧,帧,20,20*2,3);
矢量圆;
findContours(框架、轮廓、存储、CV-RETR-CCOMP、CV-CHAIN-Abrox-SIMPLE);
向量等高线_poly(_courts.size());
向量boundRect(_outlows.size());
向量中心(_等高线.size());
向量体(_contours.size());
内部温度=0;
对于(int i=0;i<_courses.size();i++)
{
如果(_等高线[i].size()>100)
{
近似多边形(Mat(_等高线[i]),等高线_多边形[i],3,真);
boundRect[i]=boundingRect(Mat(_等高线[i]);
MineConclosingCircle((Mat)_轮廓[i],中心[i],半径[i]);
温度=i;
打破
}
}
双dur=时钟()-启动;
printf(“每帧平均时间%f ms.fps%f.frameno=%d\n”,avgdur(dur),avgfps(),frameno++);
帧计数器++;
如果(帧计数器==3600)
打破
如果(等待键(1000/120)>=0)中断;
}
更新
使用Zaw-Lin方法执行程序!
我已经发布了一种方法来做到这一点。有必要进行一点平均,否则fps将过于跳跃 编辑 我在process()中加入了一个Sleep,它给出了正确的fps和持续时间(+/-1ms)
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括
#包括
使用名称空间cv;
#如果已定义(_MSC_VER)|已定义(WIN32)|已定义(_WIN32)|已定义(_WIN32|)\
||已定义(WIN64)| |已定义(_WIN64)| |已定义(uu WIN64_uuu)
#包括
bool_qpcInited=假;
双PCFreq=0.0;
__int64 countstart=0;
void InitCounter()
{
大整数李;
if(!QueryPerformanceFrequency(&li))
{
标准::cout 1000)
{
_fpstart=时钟();
_平均GFPS=0.7*_平均GFPS+0.3*_fps1秒;
_fps1sec=0;
}
_fps1sec++;
返回平均GFPS;
}
脱空工艺(垫和框架)
{
睡眠(3);
}
int main(int argc,字符**argv)
{
int frameno=0;
cv::垫架;
cv::视频捕获上限(0);
对于(;;)
{
//cap>>框架;
双启动=时钟();
过程(框架);
双dur=时钟()-启动;
printf(“每帧平均时间%f ms.fps%f.frameno=%d\n”,avgdur(dur),avgfps(),frameno++);
如果(等待键(1)=27)
出口(0);
}
返回0;
}
如果处理视频文件,可以使用OpenCV的API获取原始FPS。从实时流捕获时,以下方法不起作用:
cv::VideoCapture capture("C:\\video.avi");
if (!capture.isOpened())
{
std::cout << "!!! Could not open input video" << std::endl;
return;
}
std::cout << "FPS: " << capture.get(CV_CAP_PROP_FPS) << std::endl;
cv::VideoCapture捕获(“C:\\video.avi”);
如果(!capture.isOpened())
{
std::cout您可以使用opencv助手
#包括
#包括
#包括“opencv2/core.hpp”
#包括“opencv2/core/utility.hpp”
#包括“opencv2/video.hpp”
#包括“opencv2/highgui.hpp”
使用名称空间cv;
内部主(内部ac,字符**av){
视频捕获(0);
垫架;
对于(;;){
int64 start=cv::getTickCount();
捕获>>帧;
if(frame.empty())
打破
/*在这里做一些图像处理*/
char key=(char)waitKey(1);
双fps=cv::getTickFrequency()/(cv::getTickCount()-start);
std::cout我只需测量walltime,然后简单地将帧除以经过的时间。在linux上:
/*
* compile with:
* g++ -ggdb webcam_fps_example2.cpp -o webcam_fps_example2 `pkg-config --cflags --libs opencv`
*/
#include "opencv2/opencv.hpp"
#include <time.h>
#include <sys/time.h>
using namespace cv;
using namespace std;
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
// Handle error
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
int main(int argc, char** argv)
{
VideoCapture cap;
// open the default camera, use something different from 0 otherwise;
// Check VideoCapture documentation.
if(!cap.open(0))
return 0;
cap.set(CV_CAP_PROP_FRAME_WIDTH,1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,1080);
double wall0 = get_wall_time();
for(int x = 0; x < 500; x++)
{
Mat frame;
cap >> frame;
if( frame.empty() ) break; // end of video stream
//imshow("this is you, smile! :)", frame);
if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC
}
double wall1 = get_wall_time();
double fps = 500/(wall1 - wall0);
cout << "Wall Time = " << wall1 - wall0 << endl;
cout << "FPS = " << fps << endl;
// the camera will be closed automatically upon exit
// cap.close();
return 0;
}
/*
*编译时使用:
*g++-ggdb webcam\u fps\u example2.cpp-o webcam\u fps\u example2`pkg config--cflags--libs opencv`
*/
#包括“opencv2/opencv.hpp”
#包括
#包括
使用名称空间cv;
使用名称空间std;
双进站时间(){
结构时间值时间;
if(gettimeofday(&time,NULL)){
//处理错误
返回0;
}
返回(双)time.tv_sec+(双)time.tv_usec*.000001;
}
int main(int argc,字符**argv)
{
视频捕捉帽;
//打开默认相机,使用与0不同的东西,否则;
//查看视频捕获文档。
如果(!cap.open(0))
返回0;
封盖套件(CV、封盖、道具、框架、宽度,1920);
封盖套件(CV、封盖、支柱、框架、高度,1080);
double wall0=获取墙时间();
对于(int x=0;x<500;x++)
{
垫架;
cap>>框架;
if(frame.empty())中断;//视频流结束
//imshow(“这就是你,微笑!:)”,框架);
如果(waitKey(10)==27)中断;//按ESC停止捕获
}
double wall 1=获取墙时间();
双fps=500/(墙1-墙0);
你想测量视频的fps还是当前运行时的fps(以了解算法的运行速度)?我正在寻找一种测量运行时fps的方法!ge
/*
* compile with:
* g++ -ggdb webcam_fps_example2.cpp -o webcam_fps_example2 `pkg-config --cflags --libs opencv`
*/
#include "opencv2/opencv.hpp"
#include <time.h>
#include <sys/time.h>
using namespace cv;
using namespace std;
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
// Handle error
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
int main(int argc, char** argv)
{
VideoCapture cap;
// open the default camera, use something different from 0 otherwise;
// Check VideoCapture documentation.
if(!cap.open(0))
return 0;
cap.set(CV_CAP_PROP_FRAME_WIDTH,1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,1080);
double wall0 = get_wall_time();
for(int x = 0; x < 500; x++)
{
Mat frame;
cap >> frame;
if( frame.empty() ) break; // end of video stream
//imshow("this is you, smile! :)", frame);
if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC
}
double wall1 = get_wall_time();
double fps = 500/(wall1 - wall0);
cout << "Wall Time = " << wall1 - wall0 << endl;
cout << "FPS = " << fps << endl;
// the camera will be closed automatically upon exit
// cap.close();
return 0;
}