在上一篇文章中介绍了图像颜色空间缩减、查找表等内容。在对图像像素进行遍历时共有三种方法:
(1). C操作符[] (指针方式访问)
(2). 迭代器iterator
(3). 动态地址计算
这三种像素遍历方式在速度上有所不同,上一篇文章介绍过用C操作符[]是最快的访问方式。下面会通过对同一幅图像进行处理来直观的比较三种访问方式的速度差异。首先介绍一下opencv中提供的计时函数
1.计时函数
opencv中提供两个简便的计时函数getTickCount()和getTickFrequency(),这两个函数配合使用即可计算出程序耗时,这两个函数有点类似于C++中的clock()函数和CLK_TCK(C\C++中计时、延时函数)
getTickCount():返回CPU自某时间开始的时钟周期
getTickFrequency():获取CPU时钟频率
其用法如下所示:
double start,stop,duration;
start = static_cast<double>(getTickCount()); //记录当前时刻CPU时钟周期
/*
...
代码片段
...
*/
stop = static_cast<double>(getTickCount()); //记录程序运行结束CPU时钟周期
duration = ((double)(stop - start))/getTickFrequency(); //计算时间,以秒为单位
//上述代码也可精简
double timeConsume,start;
start = static_cast<double>(getTickCount()); //记录当前时刻CPU时钟周期
/*
...
代码片段
...
*/
timeConsume = ((double)getTickCount() - start) / getTickFrequency();
2.常用像素存储结构
在介绍像素遍历之前需要先对opencv中像素的存储方式有一定的了解,不然直接看代码的适合可能不知所云,比较费劲。
有一些opencv中常见的数据结构使用”<<”操作符进行输出如:
#include <iostream>
#include <opencv2/core.hpp>
using namespace std;
using namespace cv;
int main()
{
//2D Point
Point2f P(5, 1);
cout << endl << "Point (2D) = " << P << endl << endl;
//3D Point
Point3f P3f(2, 5, 7);
cout << "Point (3D) = " << P3f << endl << endl;
//std::vector via cv::Mat
vector<float> v;
v.push_back((float)CV_PI); //将pi的值以float类型存入v,push_back是C++中容器的一种操作方式
v.push_back(2);
v.push_back(3.01f);
cout << "vector of floats via Mat = " << endl << Mat(v) << endl << endl;
//std::vector of points
vector<Point2f> vPoints(20)