在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类型计算马氏距离太慢了。如何提高效率?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Mat遍历的方法

OpenCV Mat遍历的方法

矢量量化中的马氏距离与欧几里得距离

在 C++ 中拟合 2d 高斯函数太慢了

如何使用 Keras 计算马氏距离?

opencv编程中cvMat到Mat如何进行数据转换?