2017-12-20 9 views
0

다음 코드에서 두 간단한 히스토그램이 있습니다. 소스에 하드 코딩 된 것입니다. 각 막대 그래프에는 128 개의 저장소가 있으며 64 개의 첫 번째 저장소는 하나의 막대 그래프에 해당하고 64 개의 저장소는 다른 막대 그래프에 해당합니다. 그러나 결과 거리는 0입니다. 각 벡터의 128 개 저장소의 후자의 64 개 저장소에 명확한 차이가 있더라도. 나는 두 개의 다른 벡터가 널 거리를 갖는 이유가 어떻게 가능한지 이해하지 못합니다.openCV의 EMD-L1 알고리즘은 거리가 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; 
} 

결과 : 당신의 행렬 크기가 1 행과 64 COLS이며 하나의 안부를 필요로하기 때문에 theEMD-L1 거리가 0

답변

0

그게 왜

dist = 0 

는 설명 어떤 도움 주셔서 감사합니다 마티스.

+0

* width *가 * cols *와 nto * rows *에 해당하기 때문에'(width = a, height = b)'가'(rows = b, cols = a)'라는 것을 잊었습니다. –