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);
và
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.
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! –
@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