1、OpenCV程序(环境:CPU i5-9500+VS2017+OpenCV4.5.0)
方法1:利用“ Mat.at<存储类型>(行,列) ”访问Mat矩阵元素并赋值
int main()
{
int n = 10000;
Mat img = Mat::zeros(Size(n, n), CV_64FC1);
DWORD startTime = GetTickCount();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
img.at<double>(i, j) = 6.66;
}
}
DWORD endTime = GetTickCount();
cout << "The run time is : " << endTime - startTime << " ms" << endl;
system("pause");
return 0;
}
方法2-1:利用“ Mat.data ”访问Mat矩阵元素并赋值
int main()
{
int n = 10000;
Mat img = Mat::zeros(Size(n, n), CV_64FC1);
DWORD startTime = GetTickCount();
double* pData = (double*)img.data;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
*(pData) = 6.66;
pData++;
}
}
DWORD endTime = GetTickCount();
cout << "The run time is : " << endTime - startTime << " ms" << endl;
system("pause");
return 0;
}
方法2-2:利用“ Mat.data ”访问Mat矩阵元素并赋值
int main()
{
int n = 10000;
Mat img = Mat::zeros(Size(n, n), CV_64FC1);
DWORD startTime = GetTickCount();
double* pData = (double*)img.data;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
pData[n * i + j] = 6.66;
}
}
DWORD endTime = GetTickCount();
cout << "The run time is : " << endTime - startTime << " ms" << endl;
system("pause");
return 0;
}
方法3-1:利用“ Mat.ptr<存储类型>(行)[列] ”访问Mat矩阵元素并赋值
int main()
{
int n = 10000;
Mat img = Mat::zeros(Size(n, n), CV_64FC1);
DWORD startTime = GetTickCount();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
img.ptr<double>(i)[j] = 6.66;
}
}
DWORD endTime = GetTickCount();
cout << "The run time is : " << endTime - startTime << " ms" << endl;
system("pause");
return 0;
}
方法3-2:利用“ Mat.ptr<存储类型>(行)[列] ”访问Mat矩阵元素并赋值(速度最快)
int main()
{
int n = 10000;
Mat img = Mat::zeros(Size(n, n), CV_64FC1);
DWORD startTime = GetTickCount();
double *p = NULL;
for (int i = 0; i < n; i++)
{
p = img.ptr<double>(i); // p指针指向第i行第0个元素
for (int j = 0; j < n; j++)
{
p[j] = 6.66;
}
}
DWORD endTime = GetTickCount();
cout << "The run time is : " << endTime - startTime << " ms" << endl;
system("pause");
return 0;
}
2、访问速度比较
OpenCV单通道Mat矩阵元素访问方法 | 10,000×10,000矩阵元素访问并赋值时间 |
---|---|
1:Mat.at<存储类型>(行,列) | 4,500 ms |
2-1:Mat.data | 200 ms |
2-2:Mat.data | 172 ms |
3-1:Mat.ptr<存储类型>(行)[列] | 1,700 ms |
3-2:Mat.ptr<存储类型>(行)[列] | 140 ms |