Opencv开发笔记六:像素的读写(二)读写效率比较
一、如何计算效率
要计算程序运行的效率,就需要获得程序运行到当前位置所用运行的时间
opencv中提供两个简便的计时函数getTickCount()和getTickFrequency()
double t = (double)getTickCount();
// do something ...
t = ((double)getTickCount() - t)/getTickFrequency();
使用方式如上
二、代码测试
编写代码实现
创建一张500*500 3通道图像,连续向3通道写入随机数的测试程序,然后同等条件下测试效率
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
RNG rng(1234);
void p_RW_Pixel(Mat &src){
for (int row = 0; row < src.rows; row++){
Vec3b * cur = src.ptr<Vec3b>(row); // 获取当前行的指针
for (int col = 0; col < src.cols; col++){
if (src.channels() == 3){
cur[col][0] = rng.uniform(0, 255) % 255; // b赋值随机颜色
cur[col][1] = rng.uniform(0, 255) % 255;
cur[col][2] = rng.uniform(0, 255) % 255;
}
}
}
}
void iter_RW_Pixel(Mat &src){
MatIterator_<Vec3b> iter;
for (iter = src.begin<Vec3b>(); iter != src.end<Vec3b>(); iter++){
(*iter)[0] = rng.uniform(0, 255) % 255;
(*iter)[1] = rng.uniform(0, 255) % 255;
(*iter)[2] = rng.uniform(0, 255) % 255;
}
}
void at_RW_Pixel(Mat &src){
for (int row = 0; row < src.rows; row++){
for (int col = 0; col < src.cols; col++){
if (src.channels() == 3){
src.at<Vec3b>(row, col)[0] = rng.uniform(0, 255) % 255;
src.at<Vec3b>(row, col)[1] = rng.uniform(0, 255) % 255;
src.at<Vec3b>(row, col)[2] = rng.uniform(0, 255) % 255;
}
}
}
}
int main01(int argc, char **argv){
Mat src = Mat::zeros(500, 500, CV_8UC3);
double t_start = static_cast<double>(getTickCount()); // 程序开始的时间
// 中间的时间就是需要测试程序的时间
p_RW_Pixel(src);
//iter_RW_Pixel(src);
//at_RW_Pixel(src);
double t_end = static_cast<double>(getTickCount());// 程序结束的时间
double timeConsume = (t_end - t_start) / getTickFrequency();
printf("time consume: %.5f ms\n", timeConsume*1000);
imshow("src", src);
waitKey(0);
return 0;
}
int main(int argc, char **argv){
Mat src = Mat::zeros(500, 500, CV_8UC3); // 创建一张500*500 3通道图像
double t_start, timeConsume;
// 计算at函数的效率
t_start = static_cast<double>(getTickCount()); // 程序开始的时间
// 中间的时间就是需要测试程序的时间
at_RW_Pixel(src);
timeConsume = ((double)getTickCount() - t_start) / getTickFrequency();
printf("at time consume: %.5f ms\n", timeConsume * 1000);
// 计算指针的效率
t_start = static_cast<double>(getTickCount()); // 程序开始的时间
// 中间的时间就是需要测试程序的时间
p_RW_Pixel(src);
timeConsume = ((double)getTickCount() - t_start) / getTickFrequency();
printf("p time consume: %.5f ms\n", timeConsume * 1000);
// 计算iterator的效率
t_start = static_cast<double>(getTickCount()); // 程序开始的时间
// 中间的时间就是需要测试程序的时间
iter_RW_Pixel(src);
timeConsume = ((double)getTickCount() - t_start) / getTickFrequency();
printf("iterator time consume: %.5f ms\n", timeConsume * 1000);
imshow("src", src);
waitKey(0);
return 0;
}