opencv中测量运行时间的函数

最开始的C接口中的是 cvGetTickCount()和 cvGetTickFrequency(),在程序段的开始和结束时两次使用cvGetTickCount(),然后将两次的差除以cvGetTickFrequency()后就可以获得程序段的以微秒us为单位的运行时间,不是很精确但是一般足够了。

到了2.x之后在命名空间cv中又多了几个函数,getTickCount(),getTickFrequency(),getCPUTickCount(),此时仍然可以使用上面的C接口的函数,也可以使用这几个namespace cv中的函数,两次使用getTickCount(),然后再除以getTickFrequency(),不过需要注意的是这时计算出来的是以秒s为单位的时间,这个是与上面的带cv前缀的函数的不同,而要使用更精确的计时,就需要使用getCPUTickCount(),不过现代计算机CPU的频率会随着负载而变化所以没大有必要使用该函数,可以参看函数的介绍【Also, since a modern CPU varies the CPU frequency depending on the load, the number of CPU clocks spent in some code cannot be directly converted to time units. Therefore,getTickCount is generally a preferable solution for measuring execution time.】也就是使用getTickCount就足够了。

同时C++接口中还将上面的函数封装为了一个类TickMeter,方便使用,下面是关于TickMeter的声明和实现的源码:

[cpp] view plaincopyprint?

  1. //contrib.hpp
  2. class CV_EXPORTS TickMeter
  3. {
  4. public:
  5. TickMeter();
  6. void start();
  7. void stop();
  8. int64 getTimeTicks() const;
  9. double getTimeMicro() const;
  10. double getTimeMilli() const;
  11. double getTimeSec()   const;
  12. int64 getCounter() const;
  13. void reset();
  14. private:
  15. int64 counter;
  16. int64 sumTime;
  17. int64 startTime;
  18. };
  19. CV_EXPORTS std::ostream& operator<<(std::ostream& out, const TickMeter& tm);
  20. //Spinimages.cpp
  21. cv::TickMeter::TickMeter() { reset(); }
  22. int64 cv::TickMeter::getTimeTicks() const { return sumTime; }
  23. double cv::TickMeter::getTimeMicro() const { return (double)getTimeTicks()/cvGetTickFrequency(); }
  24. double cv::TickMeter::getTimeMilli() const { return getTimeMicro()*1e-3; }
  25. double cv::TickMeter::getTimeSec()   const { return getTimeMilli()*1e-3; }
  26. int64 cv::TickMeter::getCounter() const { return counter; }
  27. void  cv::TickMeter::reset() {startTime = 0; sumTime = 0; counter = 0; }
  28. void cv::TickMeter::start(){ startTime = cvGetTickCount(); }
  29. void cv::TickMeter::stop()
  30. {
  31. int64 time = cvGetTickCount();
  32. if ( startTime == 0 )
  33. return;
  34. ++counter;
  35. sumTime += ( time - startTime );
  36. startTime = 0;
  37. }
  38. std::ostream& cv::operator<<(std::ostream& out, const TickMeter& tm){ return out << tm.getTimeSec() << "sec"; }

可以看出TickMeter仅仅是将C接口的函数进行了一下封装,不过使用时就方便多了,不用去反复gettickcount然后除以frequency了,只需要在开始时调用start();结束时调用stop(),然后如果需要以us为单位的运行时间就调用getTimeMicro(),以ms为单位的就调用getTimeMilli(),以s为单位的是getTimeSec(),而getTimeTicks()返回运行时间的tickcount,getTimeTicks()返回的是调用stop的次数,同时该类还重载了ostream,可以方便的以s为单位直接输出。

一个小例子:

[cpp] view plaincopyprint?

  1. TickMeter tm;
  2. tm.start();
  3. int col=temp.cols, row = temp.rows;
  4. if (temp.isContinuous())
  5. {
  6. col*=row;
  7. row =1;
  8. }
  9. for (i=0; i<row; ++i)
  10. {
  11. const float *pt = temp.ptr<float>(i);
  12. for (j=0; j<col;++j)
  13. {
  14. float mm=pt[3*j];
  15. mm = mm/(float)20.6;
  16. }
  17. }
  18. tm.stop();
  19. cout<<"count="<<tm.getCounter()<<",process time="<<tm.getTimeMilli()<<endl;

【NOTE!TickMeter对象的计时是累积的,如果要分段计时的话,获取运行时间之后,下一次调用start()之前需要调用reset()将计时归零,否则获得的时间是累积运行时间】

时间: 2024-10-08 14:58:42

opencv中测量运行时间的函数的相关文章

【opencv基础】测量运行时间的函数getTickCount/getCPUTickCount/getTickFrequency

函数的计算结果类型是double,单位是秒. 要使用更精确的计时,就需要使用getCPUTickCount(),不过现代计算机CPU的频率会随着负载而变化所以没大有必要使用该函数,可以参看函数的介绍[Also, since a modern CPU varies the CPU frequency depending on the load, the number of CPU clocks spent in some code cannot be directly converted to t

OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(1)

(一)本节教程的目的 本节你将学到: 1--如何使用Point在图像中定义2D点 2--如何以及为何使用Scalar 3--用OpenCv的函数Line绘直线 4--用OpenCvd的函数ellipse绘制椭圆 5--用OpenCv的函数rectangle绘矩形 6--用OpenCv的函数circle绘圆 7--用OpenCv的函数fillPoly绘填充多边形 (二)原理,本节我们将大量使用Point和Scalar这两个结构: **********************************

关于opencv中人脸识别主函数的部分注释详解。

近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObjects 这个识别主函数的源代码,尝试了解并进行改造它,以提高精确度. 可惜实力有限啊,里面的结构非常复杂,参杂着更多的函数体,有一些是网上找不到用法的,导致最终无法整体了解,只搞了一般,这里分享 下我自己总结的注释. 1 CvSeq* cvHaarDetectObjects( const CvAr

opencv中的cv2.namedWindow()函数使用

用法: cv2.namedWindow('窗口标题',默认参数) 窗口大小可以改变: cv2.namedWindow("image",cv2.WINDOW_NORMAL) 或者cv2.namedWindow('image',cv2.WINDOW_GUI_NORMAL) 窗口大小不可以改变: cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE) 窗口大小自适应比例: cv2.namedWindow("image"

OpenCV中几何形状识别与测量

经常看到有学习OpenCV不久的人提问,如何识别一些简单的几何形状与它们的颜色,其实通过OpenCV的轮廓发现与几何分析相关的函数,只需不到100行的代码就可以很好的实现这些简单几何形状识别与对象测量相关操作.本文就会演示给大家如何通过OpenCV 轮廓发现与几何分析相关函数实现如下功能: 几何形状识别(识别三角形.四边形/矩形.多边形.圆) 计算几何形状面积与周长.中心位置 提取几何形状的颜色 在具体代码实现与程序演示之前,我们先要搞清楚一些概念. 一:基本概念与函数介绍 1. 轮廓(cont

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

部分 V图像特征提取与描述 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相信你们大多数人都玩过拼图游戏吧.首先你们拿到一张图片的一堆碎片,要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像.问题是,你怎样做到的呢?如果把你做游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了.如果计算机可以玩拼图,我们就可以给计算机一大堆自然图片,然后就可以让计算机把它拼成一张大图了.如果计算机可以自动拼接自然图片,那我们是不是可

OpenCV中feature2D学习——FAST特征点检测

在前面的文章<OpenCV中feature2D学习--SURF和SIFT算子实现特征点检测>中讲了利用SIFT和SURF算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测. FAST的全名是:Features from Accelerated Segment Test,主要特点值计算速度快,比已知的其他特征点检测算法要快很多倍,可用于计算机视觉应用的实时场景.目前以其高计算效率(computational performance).高可重复性(highrepeatability)成为

对OpenCV中seamlessClone的初步实验

seamlessClone是OpenCV中新出现的函数,应该说如果能够基于较为准确的图像分割,能够得到很好的结果. 原始的前景,背景 三种flag下的融合结果 //注意头文件中添加  #include <opencv2/photo.hpp> int main( int argc, const char** argv ){    Mat src = imread("iloveyoupapa.png");    Mat dst = imread("wood.png&q

openCV中的findHomography函数分析以及RANSAC算法的详解

本文将openCV中的RANSAC代码全部挑选出来,进行分析和讲解,以便大家更好的理解RANSAC算法.代码我都试过,可以直接运行. 在计算机视觉和图像处理等很多领域,都需要用到RANSAC算法.openCV中也有封装好的RANSAC算法,以便于人们使用.关于RANSAC算法的一些应用,可以看我的另一篇博客: 利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 但是前几天师弟在使用op