2012-06-08 45 views
5

Tôi đang cố gắng học OpenCV, và là một cứng đầu, tôi đang cố gắng để chạy các thuật toán sau đây:OpenCV yếu tố truy cập từ Mat

cv::Mat cur_features; 
cv::goodFeaturesToTrack(current_image, cur_features, 400, 0.01, 0.01); 

Bây giờ, là cá nhân lì lợm, tôi quan tâm để xem những gì cur_features đang nắm giữ ... Tôi mong đợi một 400x2 cv :: Mat nhưng thay vì tôi nhận được một 400x1 cv :: Mat

Không to lớn, tôi nghĩ rằng đó có thể là chỉ số trực tiếp. Tuy nhiên, đối với CUỘC SỐNG của tôi, tôi KHÔNG THỂ trích xuất một giá trị từ cur_features.at (0) và in ra.

Tôi đang làm gì sai? Tôi đã thấy goodFeaturesToTrack_Demo.cpp. Một số điều cần lưu ý trên bản demo đó khác với tôi. Tôi đã thử các cuộc gọi sau đây cho ví dụ đó:

std::cout << cur_features.size() << std::endl; // This throws a compile time error even though its in the example 
std::cout << cur_features.at<Point2f>(0).x << std::endl; //This throws a run time error. 

Bất kỳ ai có thể dẫn tôi đến một số tài liệu giải thích cách đạt được mục tiêu của tôi không? Các goodFeaturesToTrack cho bạn biết nó trả về một OutputArray là một vector của các góc, nhưng không nơi nào nó mô tả loại của các góc đó là gì. Ở đâu trong tài liệu này tôi sẽ tìm câu trả lời này trong trường hợp tôi nhận được nó với các phương pháp khác?


Edit: Ngoài ra, whats điểm của Mat :: loại(). Tôi không thể tìm thấy nơi mà giá trị trả lại có thể được giải thích ... Tôi đang tìm một điều tra trong tài liệu nhưng gặp khó khăn khi tìm kiếm nó.

std::cout << current_image.type() << std::endl; //This returns 0 
std::cout << cur_features.type() << std::endl; //This returns 13 
+1

Đối với kiểu liệt kê, hãy tìm trong loại_c.h, bạn sẽ tìm thấy '#define CV_8UC1 CV_MAKETYPE (CV_8U, 1)' và v.v. Đó là loại() trả về – Pablo

Trả lời

5

Như một gợi ý, cố gắng khởi tạo ma trận với kích thước và gõ

cv::Mat cur_features(400,1,CV_32_FC1); //400x1 32 bits, 1 channel 
cv::Mat cur_features2(400,1,CV_32_FC2); //400x1 32 bits, 2 channels 

Để có được một giá trị của một Mat

int pos = 0; 
foat value = cur_features.at<float>(pos); 
cv::Vec2f value2 = cur_features2.at<Vec2f>(pos); // for a two channel, CV_23F image 

Và một kỹ thuật debug tiện dụng cho Visual Studio đã giúp tôi rất nhiều

  • 1- Nhấp chuột phải cur_features khi gỡ lỗi.
  • 2- QuickWatch
  • 3 Viết này:

    (float *) cur_features.data, 400

  • 4- Bạn sẽ thấy tất cả các giá trị của mảng

+0

lỗi cố định: số kênh cũng ảnh hưởng đến kiểu dữ liệu của một pixel đơn lẻ, cũng không phải là 32_FC1 nhưng CV_32_FC1. –

2

Nó nói ở đây: http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html

đó bạn nên cho nó một vector<Point2f> như các mảng đầu ra.

Nó được khai báo như vậy trong goodFeaturesToTrack_Demo.cpp trong bản sao cục bộ của tôi về OpenCV:

vector<Point2f> corners; 
    ... 
    /// Apply corner detection 
    goodFeaturesToTrack(src_gray, 
       corners, 
       maxCorners, 
       qualityLevel, 
       minDistance, 
       Mat(), 
       blockSize, 
       useHarrisDetector, 
       k); 

UPDATE: Các liên kết tôi đã trên sử dụng một đối số mẫu OutputArray cho góc. Tài liệu tại số http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html đối với phiên bản 2.1 của thư viện làm trạng thái vector<Point2f>

+1

Xin chào Pablo, cảm ơn bạn đã trả lời. Tôi gặp khó khăn khi tìm tài liệu trong đó ghi chú rằng nó phải là vector . Tuy nhiên, tôi đồng ý rằng các ví dụ ghi chú việc sử dụng một std :: vector của cấu trúc Point2f. – Constantin

+0

'std :: vector' và' cv :: vector' giống nhau (tiện ích typedef, kiểm tra tiêu đề). Điều không giống nhau là 'cv :: Vec ' –

4

Nó chỉ ra rằng mặc dù goodFeaturesToTrack của tôi trả về 400x1, tôi đã làm trên hình ảnh đen và do đó không có góc. Điều này gây ra

cur_features.data == NULL 

Tình huống thú vị khi mã C có vẻ dễ dàng và thân thiện với người dùng hơn mã C++.

Các vấn đề liên quan