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;
}

Opencv开发笔记六:像素的读写(二)读写效率比较

Opencv开发笔记六:像素的读写(二)读写效率比较

Opencv开发笔记六:像素的读写(二)读写效率比较