在opencv中,使用Mat类型计算马氏距离太慢了。如何提高效率?
Posted
技术标签:
【中文标题】在opencv中,使用Mat类型计算马氏距离太慢了。如何提高效率?【英文标题】:In opencv,It's too slow by use Mat type to calculate the Mahalanobis distance. How can i improve the efficiency? 【发布时间】:2017-11-21 06:01:09 【问题描述】:Mat imv;
Mat_<double>end(1, 1);
double distance;
Mat_<double>Point(1, 3);
...
imv = Point.t();
end = Point*inv[m]*imv;
distance = sqrt(end(0, 0));
有变量类型的定义和马氏距离的计算过程。
【问题讨论】:
您的问题是什么?您测量了哪些基准?你用的是什么平台?如果您需要帮助,请再努力一点! 抱歉缺少细节。我尝试计算数据(点)和颜色模型之间的马氏距离(inv[m] 是颜色 m 的协方差矩阵)我计算每个像素之间的距离在 ROI 和颜色模型中对像素进行分类。当我运行代码时,它花了很多时间在“end = Point*inv[m]*imv”。我想知道如何优化这部分。是因为类型是Mat吗? 仍然没有minimal reproducible example,也没有任何证据表明正在进行任何测量。 【参考方案1】:很抱歉表达不清楚。我尝试遍历图像中的每个像素,计算它们与颜色模型之间的马氏距离太慢了。我一直认为应该从矩阵乘法的效率。今天我通过使用多线程提高循环速度来提高效率,它很有用。
#pragma omp parallel for num_threads(6)
for (int m = 0; m < k_num; m++)
Mat_<double>end(1, 1);
double distance = 1000;
Mat_<double>Point(1, 3);
Point(0, 0) = double(data3[j * 3]) - mean1[m].at<double>(0, 0);
Point(0, 1) = double(data3[j * 3 + 1]) - mean1[m].at<double>(0, 1);
Point(0, 2) = double(data3[j * 3 + 2]) - mean1[m].at<double>(0, 2);
end = Point * inv[m] * Point.t();
distance = sqrt(end(0, 0));
【讨论】:
以上是关于在opencv中,使用Mat类型计算马氏距离太慢了。如何提高效率?的主要内容,如果未能解决你的问题,请参考以下文章