0
次のコードでは、この単純な例ではソースにハードコードされた2つのヒストグラムがあります。各ヒストグラムには128個のビンがあり、64個の最初のビンが1つのヒストグラムに対応し、64個のビンが別のヒストグラムに対応します。しかし、各ベクトルの128個のビンの後ろの64ビンには明確な相違があるにもかかわらず、合成距離は0
です。私は2つの異なるベクトルがヌル距離を持つ理由はどういうものか分かりません。openCVのEMD-L1アルゴリズムは、ゼロである距離を計算します
#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;
}
結果:あなたの行列のサイズは1行と64のcolsのであり、あなたは、単一のCOLを必要とするのでtheEMD-L1の距離が0
はい* width *は* cols *とnto * rows *に対応していますので、 '(width = a、height = b)'は '(rows = b、cols = a)'です。 –