OPENCV库是一个应用非常广泛的计算机视觉与机器学习库,而对矩阵的访问也是最常见.的操作。尽管OPENCV已经升级了N多次,最新版本是2.4.6,但对数据的访问一直还是延续OPENCV1.X中讲解的效率最高的访问方式,也即指针方式。今天偶来兴致,想测测自己频繁使用访问数组方式的各种效率,结果令人惊讶(本测试是在OPENCV2.4.6库下进行的)。
首先准备下面三段代码(函数代码很简单,就是逐个访问矩阵中的元素):
1)根据矩阵的连续性进行访问(一直以为是效率最高的方式)
void computeWithContinious( Mat& _src, Mat& _dst, float scale){_dst = cv::Scalar::all(0);int i, j;Size size = _src.size();int chns = _src.channels();if( _src.isContinuous() && _dst.isContinuous() ){size.width *= size.height;size.height = 1;}for( i = 0; i < size.height; i++ ){const unsigned char* src = (const unsigned char*)(_src.data + _src.step*i);unsigned char* dst = ( unsigned char*)(_dst.data + _dst.step*i);for( j =0; j < size.width; j++ ){if ( chns ==1){dst[j] = src[j];}else{dst[j*chns] = ( unsigned char)(src[j*chns]*scale);dst[j*chns