openCV的EMD-L1算法计算零的距离

问题描述 投票:0回答:1

在下面的代码中,我有两个直方图,对于这个简单的例子,我在源代码中进行了硬编码。每个直方图具有128个区间,其中64个第一区间对应于一个直方图,而另外64个区间对应于另一个直方图。然而,即使在每个向量的128个区间的后64个区间中存在明显差异,合成距离也是0。我不明白为什么两个不同的向量有一个零距离是可能的。

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/shape/emdL1.hpp>

using Vec128f = cv::Vec<float, 128>;

float sum_of_emd_dists(const Vec128f& a, const Vec128f& b)
{
    const cv::Mat a_color(cv::Size{64, 1}, CV_32FC1, (void*)(&a.val[0]));
    const cv::Mat a_label(cv::Size{64, 1}, CV_32FC1, (void*)(&a.val[64]));
    const cv::Mat b_color(cv::Size{64, 1}, CV_32FC1, (void*)(&b.val[0]));
    const cv::Mat b_label(cv::Size{64, 1}, CV_32FC1, (void*)(&b.val[64]));
    float dist = cv::EMDL1(a_color, b_color) + cv::EMDL1(a_label, b_label);
    return dist;
}



int main()
{
    Vec128f a = {64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.265625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.734375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    Vec128f b = {64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.109375, 0, 0, 0, 0.109375, 0, 0, 0.09375, 0, 0, 0, 0, 0, 0, 0, 0, 0.0625, 0, 0, 0.09375, 0, 0, 0, 0.046875, 0.046875, 0, 0, 0, 0, 0, 0, 0, 0.078125, 0.140625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.09375, 0, 0, 0.0625, 0, 0, 0, 0.0625, 0, 0, 0, 0, 0, 0};
    std::cerr << "dist = " << sum_of_emd_dists(a, b) << std::endl;
    return 0;
}

结果:

dist = 0

感谢您解释为什么EMD-L1距离为0的任何帮助。

c++ opencv
1个回答
0
投票

那是因为你的矩阵大小是1行和64列,你需要单个col martix。

© www.soinside.com 2019 - 2024. All rights reserved.