两种计时函数详解

发布于:2023-01-04 ⋅ 阅读:(311) ⋅ 点赞:(0)

目录:
1.clock();
2.getTickCount();

1.c/c++提供的clokc()函数

**· **clock_t clock (void);
**· **引用头文件:#inlcude<time.h> /
**· **函数返回值类型:clock_t ,参数为空;

使用前 可以先定义两个clock_t类型的变量,如:clock_t begin ,end;
然后分别用这两个变量记录调用函数前后的clock()
最后cout输出,输出时应注意以下几点

  1. 在(end - begin) 后 ,需要除上 CLOCKS_PER_SEC * 1000,这样算出来就是毫秒;
  2. 由于变量类型是clock_t ,所以还需要强制转换为float/double;

下面见代码示例:

#include<iostream>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;


void BGRToGray(Mat &src, Mat &dest)
{
	dest.create(src.rows,src.cols, CV_8UC1);
	for (int r = 0; r < src.rows; r++)
	{
		for (int c = 0; c < src.cols; c++)
		{
			Vec3b & m = src.at<Vec3b>(r, c);
			int gray = (m[2] * 30 + m[1] * 59 + m[0] * 11 + 50) / 100;
			dest.at<uchar>(r, c) = gray;
		}
	}
}

int main()
{
	Mat src = imread("D:\\photogallery\\人物\\image_11.jpg");
	Mat grayimg;

	clock_t begin1, end1,begin2,end2,begin3,end3;
	begin1 = clock();
	cvtColor(src, grayimg, COLOR_BGR2GRAY);
	end1 = clock();

	begin2 = clock();
	cvtColor(src, grayimg, COLOR_BGR2GRAY);
	end2 = clock();

	begin3 = clock();
	Mat mygray;
	BGRToGray(src, mygray);
	end3 = clock();

    //有问题请检查这行代码
	cout << "所用时间:" << double(end1 - begin1) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
	cout << "所用时间:" << double(end2 - begin2) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
	cout << "所用时间:" << double(end3 - begin3) / CLOCKS_PER_SEC * 1000 << "ms" << endl;

	namedWindow("src");
	namedWindow("gray");
	namedWindow("mygray");
	imshow("src", src);
	imshow("gray", grayimg);
	imshow("mygray", mygray);

	waitKey(0);

	return 0;
}

运行结果如图:
在这里插入图片描述

2.Windows/opencv提供的getTickCount()函数;

**· **long long getTickCount (void);
**· **无需引用额外的头文件;
**· **函数返回值类型:long long ,参数为空;

使用时可以和上面clock()函数的使用方式一致,只需要把函数换一下即可,在这里就不展示了;这里给出一种函数的写法。
赋值时应注意以下几点

  1. 在(current - last)后 ,需要除上 getTickFrequency();

  2. 由于变量类型是long long ,所以还需要强制转换为float/double;

  3. 最后再*1000,这样算出来就是毫秒;

具体使用如下:

#include<iostream>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;

//计时函数
void PrintMs(const char*text = "")
{
	static long long last = 0;
	long long current = getTickCount();
	if (last == 0)
	{
		last = current;
		return;
	}
	long long ms = 0;
	ms = ((double)(current - last) / getTickFrequency()) * 1000;//最容易出问题的一行代码
	if (*text != 0)
	{
		cout << ms << " ms" << endl;
	}
	last = getTickCount();
}

//自己的转灰度函数
void BGRToGray(Mat &src, Mat &dest)
{
	dest.create(src.rows,src.cols, CV_8UC1);
	for (int r = 0; r < src.rows; r++)
	{
		for (int c = 0; c < src.cols; c++)
		{
			Vec3b & m = src.at<Vec3b>(r, c);
			int gray = (m[2] * 30 + m[1] * 59 + m[0] * 11 + 50) / 100;
			dest.at<uchar>(r, c) = gray;
		}
	}
}

int main()
{
	Mat src = imread("D:\\photogallery\\人物\\image_11.jpg");
	Mat grayimg;

	PrintMs("");
	cvtColor(src, grayimg, COLOR_BGR2GRAY);
	cout << "第一次cvtColor所耗时间:";
	PrintMs("cvtColor");

	cvtColor(src, grayimg, COLOR_BGR2GRAY);
	cout << "第二次cvtColor所耗时间:";
	PrintMs("cvtColor");

	
	Mat mygray;
	BGRToGray(src, mygray);
	cout << "BGRToGray所耗时间:";
	PrintMs("BGRToGray");
	
	
	namedWindow("src");
	namedWindow("gray");
	namedWindow("mygray");
	imshow("src", src);
	imshow("gray", grayimg);
	imshow("mygray", mygray);

	waitKey(0);

	return 0;
}

运行结果如图:
在这里插入图片描述

有任何疑问欢迎在评论区留言。