在对这个主题做了一些研究后,我认为从cv :: Mat元素访问元素会比使用at方法更快(因为显然每次检查边界并且如果我理解正确就会进行乘法运算)!
虽然,我写了一个小测试,并且每次使用时似乎快了大约1000倍:/!所以我想我做错了但我无法弄清楚是什么......
有我的代码:
int main(int argc, char **argv) {
int k = 0;
int size[] = {100, 100};
cv::Mat image(2, size, CV_32SC1, cv::Scalar::all(0));
for (int i = 0; i < size[0]; i++) {
for (int j = 0; j < size[1]; j++) {
image.at<int>(i, j) = k;
k++;
}
}
int *myval;
int width = image.cols;
int height = image.rows;
myval = image.ptr<int>(0);
int val;
double t = (double)cv::getTickCount();
for (int i = 0; i < height*width; i++) {
val = myval[i];
}
t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
std::cout << "time ptr : " << t << std::endl;
t = (double)cv::getTickCount();
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
val = image.at<int>(i, j);
}
}
t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
std::cout << "time without ptr : " << t << std::endl;
}
所以基本上,它只访问我的矩阵的每个元素,什么都不做。 虽然我得到了这样的结果:
time ptr : 0.00017332
time without ptr : 2.77e-07
或
time ptr : 4.0991e-05
time without ptr : 7.6e-08
如果有人可以给我一些非常酷的解释或新想法!
谢谢大家:)