2014-05-03 15 views
8

Tôi đang cố gắng phát hiện các điểm chính với mọi thứ ORB là tốt cho đến khi tôi chuyển sang Opencv 2.4.9.ORB không phát hiện keyPoints trong opencv 2.4.9

flirts, có vẻ như số lượng các phím decresed, và đối với một số hình ảnh, không keypoint được phát hiện:

Đây là mã của tôi biên soạn với hai phiên bản: (2.3.1 và 2.4.9)

#include <iostream> 
#include <opencv2/opencv.hpp> 
#include <opencv2/features2d/features2d.hpp> 


using namespace cv; 


int main(int argc, char **argv){ 

    Mat img = imread(argv[1]); 

    std::vector<KeyPoint> kp; 

    OrbFeatureDetector detector; 
    detector.detect(img, kp); 
    std::cout << "Found " << kp.size() << " Keypoints " << std::endl; 

    Mat out; 
    drawKeypoints(img, kp, out, Scalar::all(255)); 

    imshow("Kpts", out); 

    waitKey(0); 
    return 0; 
} 

Kết quả: 2.3.1: Tìm thấy 152 keypoint

kp detected

2,4. 9: Tìm thấy 0 keypoint

zero kpts

Tôi cũng thử nghiệm với một Constructor ORB khác nhau, nhưng tôi nhận được kết quả tương tự, không có KPts. Các giá trị constuctor giống như trong constructor 2.3.1 mặc định của: 2.4.9 tùy chỉnh constr:

#include <iostream> 
#include <opencv2/opencv.hpp> 
#include <opencv2/features2d/features2d.hpp> 


using namespace cv; 


int main(int argc, char **argv){ 

    Mat img = imread(argv[1]); 

    std::vector<KeyPoint> kp; 

    // default in 2.4.9 is : ORB(700, 1.2f, 3, 31, 0); 
    OrbFeatureDetector detector(500, 1.2f, 8, 31, 0); // default values of 2.3.1 
    detector.detect(img, kp); 
    std::cout << "Found " << kp.size() << " Keypoints " << std::endl; 
    Mat out; 
    drawKeypoints(img, kp, out, Scalar::all(255)); 

    imshow("Kpts", out); 

    waitKey(0); 
    return 0; 
} 

Bạn có bất cứ ý tưởng gì đang xảy ra? Và làm thế nào tôi có thể sửa nó?

Cảm ơn bạn.

+0

Bạn có nhận được giải pháp nào không? –

+0

Trên các hình ảnh khác, bạn cũng tìm thấy 0 điểm chính? Hay chỉ là ít điểm then chốt hơn với openCV 2.3.1? – Whysmerhill

Trả lời

9

Việc triển khai ORB trong OpenCV đã thay đổi khá đáng kể giữa phiên bản 2.3.1 và 2.4.9. Thật khó để chỉ ra rằng một thay đổi có thể giải thích hành vi bạn đã quan sát.

Tuy nhiên, bằng cách thay đổi giá trị của ngưỡng cạnh, bạn có thể tăng số lượng tính năng được phát hiện một lần nữa.

Dưới đây là một phiên bản thích hợp của mã của bạn để hiển thị ý tôi (cẩn thận, tôi chỉ có thể kiểm tra nó bằng OpenCV 3.0.0, nhưng tôi đoán bạn sẽ có được điểm).

#include <iostream> 
#include <opencv2/opencv.hpp> 
#include <opencv2/features2d.hpp> 

using namespace cv; 

int main(int argc, char **argv){ 

    Mat img = imread(argv[1]); 

    std::vector<KeyPoint> kp; 

    // Default parameters of ORB 
    int nfeatures=500; 
    float scaleFactor=1.2f; 
    int nlevels=8; 
    int edgeThreshold=15; // Changed default (31); 
    int firstLevel=0; 
    int WTA_K=2; 
    int scoreType=ORB::HARRIS_SCORE; 
    int patchSize=31; 
    int fastThreshold=20; 

    Ptr<ORB> detector = ORB::create(
    nfeatures, 
    scaleFactor, 
    nlevels, 
    edgeThreshold, 
    firstLevel, 
    WTA_K, 
    scoreType, 
    patchSize, 
    fastThreshold); 

    detector->detect(img, kp); 
    std::cout << "Found " << kp.size() << " Keypoints " << std::endl; 

    Mat out; 
    drawKeypoints(img, kp, out, Scalar::all(255)); 

    imshow("Kpts", out); 

    waitKey(0); 
    return 0; 
} 
1

Trong OpenCV 3.1, ít nhất, tham số edgeThreshold thực sự là "kích thước của biên giới nơi các tính năng không được phát hiện." Một cách để phát hiện các tính năng bổ sung là giảm tham số fastThreshold. Đó là một tên gây hiểu lầm vì ngưỡng này ảnh hưởng đến số góc được phát hiện ngay cả khi sử dụng ORB::HARRIS_SCORE, đó là các điểm chính của Harris, không chỉ các điểm chính FAST mà bạn có thể nghĩ dựa trên tên đối số. Nó cũng có một chút gây hiểu nhầm bởi vì chính bản thân âm thanh như một ngưỡng trên phát hiện góc Harris, chứ không phải trên một phần của hình ảnh được sử dụng để phát hiện các điểm.

Xem: http://docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#gsc.tab=0.

Ngoài ra, tăng số lượng các mức kim tự tháp nlevels có thể cung cấp cho bạn nhiều điểm chính hơn, mặc dù kích thước hình ảnh của bạn giống nhau và sự khác biệt duy nhất là phiên bản OpenCV của bạn, nó không có khả năng trợ giúp ở đây.

Tôi đã gặp phải vấn đề tương tự và đây là mã hoạt động:
std::vector<KeyPoint> kpts1; Mat desc1; Ptr<ORB> orb = ORB::create(100, 2, 8, 31, 0, 2, ORB::HARRIS_SCORE, 31, 20); orb->detectAndCompute(input_image, Mat(), kpts1, desc1);

Đối số cuối cùng (20, ở trên) là fastThreshold để giảm điểm mới.

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