【问题标题】:use values(features) in a vector to calculate cosine similarity for opencv使用向量中的值(特征)计算opencv的余弦相似度
【发布时间】:2015-07-19 17:19:48
【问题描述】:

我最近正在从事一个项目,在该项目中我提取了有关图像的一些特征,并希望使用这些特征来查找两个图像之间是否有任何相似之处。 以下是我提取的特征列表:

  1. 纵横比(宽/高)
  2. 归一化区域(裁剪 roi 的区域到输入图像区域)
  3. 裁剪图像的中心
    以及单个图像的其他特征

现在,我想将这些值输入一个向量,并使用该向量查找余弦相似度。简而言之,从两个图像中使用这样的向量,并找到它们之间的相似性。 我知道两个向量的叉积是如何工作的,但是
我需要帮助将这些图像存储到矢量和矢量的使用中。任何建议将不胜感激。

【问题讨论】:

    标签: c++ image opencv vector cosine-similarity


    【解决方案1】:

    哦,不难。

    第 1 步:一个接一个地用数字填充你的特征(Mat):

    Mat feature; // you could use a std::vector, too, but cv::Mat has the 
                 // handy dot-product used below already built in.
    feature.push_back(aspect_ratio);
    feature.push_back(area);
    feature.push_back(center.x);
    feature.push_back(center.y);
    feature.push_back(more_stuff);
    ...
    

    第 2 步:要比较这些特征,请使用余弦范数:

    Mat feature_a, feature_b; // composed like above
    double ab = feature_a.dot(feature_b);
    double aa = feature_a.dot(feature_a);
    double bb = feature_b.dot(feature_b);
    return -ab / sqrt(aa*bb);
    

    【讨论】:

    • 谢谢 berak.. 我明白你是如何传递价值的。我们可以在矩阵中存储任何值吗?我的意思是这些值可以是 float 和 double 数据类型吗?
    • 第一个 push_back() 将确定 Mat 的类型。之后的任何内容都将转换为第一个的类型。
    • 嗨@berak,我正在尝试使用你帮助我的代码,但我看到theta 值是负数。我能从中推断出什么?
    • 我怎么知道,theta 是什么? (缺少所有上下文)
    • 对不起,我的错!我假设 -ab/sqrt(aa*bb) 是 theta 值。我现在明白它的 cos(theta) 值。谢谢!
    猜你喜欢
    • 2016-03-08
    • 2018-03-14
    • 2015-05-24
    • 2015-12-15
    • 2010-10-05
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多