2012-05-02 29 views
8

Tôi gặp sự cố khi in các giá trị của ma trận mô tả thu được thông qua việc sử dụng phương pháp 'tính toán' của bất kỳ trình trích xuất mô tả opencv nào. Tôi muốn in phần mô tả của một đối tượng vào từng tệp, nhưng luôn khi tôi truy cập vào một phần tử của ma trận mô tả bằng 'at', tôi nhận được một giá trị khác cho phần tử đó. Sau đây là một 'cho' loop tôi sử dụng để kiểm tra giá trị đầu ra của ma trận mô tả khi sử dụng 'at':Giá trị in của ma trận mô tả điểm khóa 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; 
     } 

Thứ hai 'nếu' là một bài kiểm tra 'nếu' tôi thực hiện để xem các giá trị in khi truy cập vào các phần tử của các bộ mô tả. Bây giờ, in bởi

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

tại nF - 2 iteraction, tôi có kết quả sau:

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

Và như mong đợi, hai bản in đầu tiên bên thứ hai 'nếu':

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

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

cho tôi [20]

Nhưng hai loại ấn chỉ khác

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

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

cho tôi 0 thay vì 20. Kết quả hoàn thành tôi đã cho dòng nF-2 tôi đã giới thiệu trước đây, khi truy cập vào các yếu tố với 'at' và in chúng là:

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 

Điều này hoàn toàn khác với những gì tôi mong đợi. Tôi đã thử rất nhiều thứ rồi: đúc với float, double, unsigned int thay vì chỉ int, và gán cho các biến của các kiểu đó; chuyển đổi ma trận trước khi in nó, sao chép ma trận sau đó chuyển đổi, tạo ma trận mô tả với một loại khác nhau ... nhưng không ai trong số họ làm việc. Tôi nghi ngờ nó có liên quan đến loại ma trận mô tả, mặc dù tôi gần như chắc chắn rằng nó có loại uchar (tôi đã kiểm tra bằng elemSize)

Cảm ơn trước và xin lỗi vì tiếng anh của tôi và kích thước của câu hỏi.

Trả lời

7

Tìm câu trả lời. Nó thực sự là một vấn đề kiểu. Loại ma trận mô tả được trả về bởi không phải là uchar như tôi nghĩ, nó thực sự là nổi.Nhận giá trị với

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

mang lại cho tôi giá trị phù hợp. Điều thú vị là tôi có thể thề rằng tôi đã thử nó trước khi trôi nổi, và nó không hoạt động. Tôi phải thử nó chỉ cho int, double và unsigned int.

1

Điều này không giải đáp được tại sao vấn đề của bạn xảy ra, nhưng tôi nhớ có vấn đề tương tự khi cố gắng truy cập các giá trị mô tả của tôi.

Tôi đã cố gắng viết một đoạn mã có thể hoạt động với bất kỳ bộ mô tả nào, vì OpenCV đã triển khai nhiều cv::DescriptorExtractor. Vấn đề là, vì tôi muốn một ngày nào đó có thể tạo các thư viện độc lập của riêng tôi, OpenCV làm việc với các giao diện mô tả của tôi, tôi muốn tất cả các bộ mô tả trong cấu trúc std::vector<vector<double> >.

Đây là mã của tôi có thể chuyển đổi cv::Mat descOld để std::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); 

Hy vọng nó sẽ giúp một số.

+0

Cảm ơn! Mặc dù nó không giải quyết được vấn đề tôi đang gặp ngay bây giờ, chuyển đổi này có thể hữu ích cho tôi trong tương lai, vì vậy tôi đánh giá cao câu trả lời của bạn! –

+0

@Alberto A Tôi biết nó không trả lời "tại sao" của vấn đề của bạn, nhưng bạn có thể thử truy cập các bộ mô tả là 'double'? Trong trường hợp của tôi, 'temp' chỉ là một con trỏ đến đầu hàng, nhưng để lấy phần tử đầu tiên của hàng bằng' temp', tôi chỉ cần 'double val = * temp'. Có thể thử như thế? Tôi biết tôi cũng đã có một thời gian khó khăn tìm kiếm loại thích hợp để truy cập vào các mô tả. – penelope