2012-05-02 61 views
8

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

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; 
     } 

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

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

印刷 - 2 iteraction,我有以下的结果:

[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] 

和预期的一样,前两个打印第二 '如果' 内:

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 I前表现,“在”与访问的元素进行打印时是:

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检查过)

在此先感谢,并且对于我的英文和对于题。

回答

7

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

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

给我正确的价值。有趣的是,我可以发誓,我之前尝试过它,并没有奏效。我一定只尝试过int,double和unsigned int。

1

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

我试图写一段代码,可以与任何描述符一起工作,因为OpenCV已经实现了多个cv::DescriptorExtractor。事情是,因为我希望有一天能够制作自己的OpenCV独立库,它们与我的描述符接口一起工作,所以我需要std::vector<vector<double> >结构中的所有描述符。

这里是我的代码转换cv::Mat descOldstd::vector< std::vector <double> > 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); 

希望它可以帮助一些。

+0

谢谢!虽然它不能解决我现在遇到的问题,但此转换可能对我将来有用,所以我很感谢您的回答! –

+0

@Alberto A我知道它没有回答你的问题的“原因”,但是你可能尝试以“double”的形式访问描述符?在我的例子中,'temp'只是一个指向行开始的指针,但要使用'temp'获得行的第一个元素,我只需要'double val = * temp'。也许尝试那样?我知道我也很难找到访问描述符的适当类型。 – penelope