第二种是第一种的三倍速度。 第一种来自视觉SLAM14讲第五章程序,主要是定义太非时间,还有就是指针调用图片数据时间是否节约时间也是问题。
// 使用 std::chrono 来给算法计时
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
for ( size_t y=0; y<image.rows; y++ )
{
// 用cv::Mat::ptr获得图像的行指针
unsigned char* row_ptr = image.ptr<unsigned char> ( y ); // row_ptr是第y行的头指针
for ( size_t x=0; x<image.cols; x++ )
{
// 访问位于 x,y 处的像素
unsigned char* data_ptr = &row_ptr[ x*image.channels() ]; // data_ptr 指向待访问的像素数据
// 输出该像素的每个通道,如果是灰度图就只有一个通道
for ( int c = 0; c != image.channels(); c++ )
{
unsigned char data = data_ptr[c]; // data为I(x,y)第c个通道的值
}
}
}
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
cout<<"遍历图像用时:"<<time_used.count()<<" 秒。"<<endl;
chrono::steady_clock::time_point t3 = chrono::steady_clock::now();
for(int x=0;x<image.rows;x=x+1)
{
for(int y=0;y<image.cols;y=y+1)
{
int r = image.at<Vec3b>(x, y)[0];
}
}
chrono::steady_clock::time_point t4 = chrono::steady_clock::now();
chrono::duration<double> time_useds = chrono::duration_cast<chrono::duration<double>>( t4-t3 );
cout<<"遍历图像用时:"<<time_useds.count()<<" 秒。"<<endl;