【问题标题】:Printing values of keypoint descriptor matrix opencv打印关键点描述符矩阵opencv的值
【发布时间】:2012-05-12 04:27:20
【问题描述】:

我在打印通过使用任何 opencv 描述符提取器的“计算”方法获得的描述符矩阵的值时遇到了一些问题。我想将一个特征的描述符一个一个地打印到一个文件中,但是当我使用“at”访问描述符矩阵的某个元素时,我会收到该元素的不同值。下面是一个'for'循环,我在使用'at'时用来测试描述符矩阵的输出值:

for(int i=0; i<nF; i++){

    if(lpx != keypoints[i].pt.x && lpy != keypoints[i].pt.y){
        usedFeatures++;
        cerr << descriptors.row(i) << endl << endl; // printing row of descriptor matrix
        fileS << keypoints[i].pt.y << " " << keypoints[i].pt.x << " ";
        fileS << keypoints[i].size << " " << keypoints[i].angle << endl;

        if(i == nF - 2){
            //printing subvector of descriptor matrix made of the element at row i and col 0
            cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl;

            //same as before just inverting the order of access
            cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl;


            //printing the value of the element with 'at'
            cerr << (int)descriptors.at<uchar>(i, 0);

            //creating a new int and giving it the value of element (i, 0) of descriptor matrix. Should be the same
            //value shown on the subvector before
            int test = descriptors.at<uchar>(i, 0);

            //printing value of element
            cerr << "i, 0: " << test << endl;
        }

第二个“if”是一个测试“if”,我在访问描述符的元素时查看打印的值。现在,由

cerr << descriptors.row(i) << endl << endl;

在 nF - 2 迭代中,我得到以下结果:

[20, 11, 0, 18, 51, 3, 0, 3, 133, 50, 0, 0, 0, 0, 0, 11, 133, 18, 0, 0, 0, 0, 0, 3,
119, 2, 0, 0, 0, 0, 0, 2, 19, 5, 0, 4, 55, 27, 1, 1, 133, 25, 0, 1, 4, 1, 0, 22, 133,
18, 0, 0, 0, 0, 0, 14, 131, 13, 1, 0, 0, 0, 0, 1, 12, 1, 0, 1, 56, 133, 25, 13, 133,
14, 0, 0, 3, 8, 20, 80, 133, 38, 0, 0, 0, 0, 0, 51, 106, 11, 1, 0, 0, 0, 0, 23, 0, 0,
0, 0, 19, 126, 70, 11, 23, 0, 0, 0, 0, 9, 83, 133, 53, 1, 0, 0, 0, 0, 2, 133, 26, 
3, 2, 0, 0, 0, 0, 28]

正如预期的那样,前两个打印在第二个'if'中:

cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl;

cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl;

给我 [20]

但其他两个打印件

cerr << (int)descriptors.at<uchar>(i, 0);

int test = descriptors.at<uchar>(i, 0);
cerr << "i, 0: " << test << endl;

给我 0 而不是 20。我之前展示的 nF-2 行的完整结果是:使用 'at' 访问元素并打印它们时:

 0 0 160 65 0 0 48 65 0 0 0 0 0 0 144 65 0 0 76 66
 0 0 64 64 0 0 0 0 0 0 64 64 0 0 5 67 0 0 72 66
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 48 65 0 0 5 67 0 0 144 65 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 64 0 0 238 66
 0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 64

这与我的预期完全不同。我已经尝试了很多东西:使用 float、double、unsigned int 而不是仅使用 int 进行强制转换,以及分配给这些类型的变量;在打印之前转换矩阵,复制矩阵然后转换,创建具有不同类型的描述符矩阵......但它们都不起作用。我怀疑它与描述符矩阵的类型有关,尽管我几乎可以肯定它具有 uchar 类型(我检查了 elemSize)

在此先感谢,对于我的英语和问题的大小,我们深表歉意。

【问题讨论】:

    标签: c++ opencv matrix unsigned-char feature-descriptor


    【解决方案1】:

    找到了答案。这确实是一个类型问题。返回的描述符矩阵的类型不像我想的那样 uchar ,它实际上是浮点数。获取价值

    (float)descriptors.at<float>(i, 0);
    

    给了我正确的价值。有趣的是我可以发誓我之前尝试过浮动,但它没有用。我必须只为 int、double 和 unsigned int 尝试过。

    【讨论】:

      【解决方案2】:

      这不能回答您的问题发生的原因,但我记得在尝试访问我的描述符值时遇到了类似的问题。

      我正在尝试编写一段可以与任何描述符一起使用的代码,因为 OpenCV 实现了多个 cv::DescriptorExtractors。问题是,因为我希望有一天能够制作我自己的、OpenCV 独立的库来使用我的描述符接口,所以我想要 std::vector&lt;vector&lt;double&gt; &gt; 结构中的所有描述符。

      这是我将cv::Mat descOld 转换为std::vector&lt; std::vector &lt;double&gt; &gt; desc 的代码:

      cv::DescriptorExtractor *descCalc;
      
      // initialize descCalc
      
      descCalc->compute(*image, feats, descOld);
      
      // conversion to std::vector<std::vector <double> > :
      
      const double *temp;
      desc.clear();
      desc.reserve(descOld.cols);
      for (int i=0, szi = this->desc.rows; i < szi; ++i){
          temp = descOld.ptr<double>(i);
          desc.push_back(std::vector<double>(temp, temp+descOld.cols));
      }
      
      assert(desc.size() == descOld.rows);
      assert(desc[0].size() == descOld.cols);
      

      希望对大家有所帮助。

      【讨论】:

      • 谢谢!虽然它不能解决我现在遇到的问题,但这种转换将来可能对我有用,所以我很感激你的回答!
      • @Alberto A 我知道它不能回答您问题的“原因”,但您可以尝试以double 的身份访问描述符?在我的例子中,temp 只是一个指向行首的指针,但要使用temp 获取行的第一个元素,我只需要double val = *temp。也许试试这样?我知道我也很难找到合适的类型来访问描述符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2012-09-11
      相关资源
      最近更新 更多