7

मुझे सुविधा पहचान एल्गोरिदम की आवश्यकता है। मैं वेब पर सर्फिंग को कुछ भी नहीं ढूंढ रहा हूं लेकिन एसयूआरएफ उदाहरण और संकेत देता है यह कैसे करें, लेकिन मुझे एसआईएफटी या एसयूआरएफ जैसे पेटेंट डिस्क्रिप्टर के अलावा कोई उदाहरण नहीं मिला।पेटेंट मुक्त वर्णनकर्ताओं के साथ फ़ीचर का पता लगाने

किसी मुक्त सुविधा का पता लगाने एल्गोरिथ्म का उपयोग का एक उदाहरण लिख सकते हैं (ओर्ब की तरह/तेज [जहाँ तक मैं समझ गया सर्फ और FLAAN हैं nonfree])?

मैं ओपनसीवी 3.0.0 का उपयोग कर रहा हूं।

उत्तर

24

एक एसयूआरएफ कीपॉइंट डिटेक्टर और डिस्क्रिप्टर निकालने वाले का उपयोग करने के बजाय, बस ओआरबी का उपयोग करने के लिए स्विच करें। अलग-अलग निकालने वाले और वर्णनकर्ताओं के लिए आप create पर पारित स्ट्रिंग को आसानी से बदल सकते हैं।

निम्नलिखित ओपनसीवी 2.4.11 के लिए मान्य है।

Feature Detector

  • "फास्ट" - FastFeatureDetector
  • "स्टार" - StarFeatureDetector
  • "झारना" - झारना (nonfree मॉड्यूल)
  • "सर्फ" - सर्फ (nonfree मॉड्यूल)
  • "ओआरबी" - ओआरबी
  • "ब्रिस्क" - ब्रिस्के
  • "MSER" - MSER
  • "GFTT" - GoodFeaturesToTrackDetector
  • "हैरिस" - हैरिस डिटेक्टर के साथ GoodFeaturesToTrackDetector सक्षम
  • "घने" - DenseFeatureDetector
  • "SimpleBlob" - SimpleBlobDetector

Descriptor Extractor

  • "SIFT" - SIFT
  • "सर्फ" - सर्फ
  • "संक्षिप्त" - BriefDescriptorExtractor
  • "तेज" - तेज
  • "ओर्ब" - ओर्ब
  • "शैतान" - फ्रिक

Descriptor Matcher

  • ब्रूटफोर्स (यह एल 2 का उपयोग करता है)
  • ब्रूटफोर्स-एल 1
  • bruteforce-आलोचनात्मक
  • bruteforce-आलोचनात्मक (2)
  • FlannBased

Flann nonfree में नहीं है।आप अन्य matchers का उपयोग कर सकते हैं, हालांकि, BruteForce की तरह।

नीचे दिए गए उदाहरण:

#include <iostream> 
#include <opencv2\opencv.hpp> 

using namespace cv; 

/** @function main */ 
int main(int argc, char** argv) 
{ 

    Mat img_object = imread("D:\\SO\\img\\box.png", CV_LOAD_IMAGE_GRAYSCALE); 
    Mat img_scene = imread("D:\\SO\\img\\box_in_scene.png", CV_LOAD_IMAGE_GRAYSCALE); 

    if (!img_object.data || !img_scene.data) 
    { 
     std::cout << " --(!) Error reading images " << std::endl; return -1; 
    } 

    //-- Step 1: Detect the keypoints using SURF Detector 
    Ptr<FeatureDetector> detector = FeatureDetector::create("ORB"); 

    std::vector<KeyPoint> keypoints_object, keypoints_scene; 

    detector->detect(img_object, keypoints_object); 
    detector->detect(img_scene, keypoints_scene); 

    //-- Step 2: Calculate descriptors (feature vectors) 
    Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("ORB"); 

    Mat descriptors_object, descriptors_scene; 

    extractor->compute(img_object, keypoints_object, descriptors_object); 
    extractor->compute(img_scene, keypoints_scene, descriptors_scene); 

    //-- Step 3: Matching descriptor vectors using FLANN matcher 
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce"); 
    std::vector<DMatch> matches; 
    matcher->match(descriptors_object, descriptors_scene, matches); 

    double max_dist = 0; double min_dist = 100; 

    //-- Quick calculation of max and min distances between keypoints 
    for (int i = 0; i < descriptors_object.rows; i++) 
    { 
     double dist = matches[i].distance; 
     if (dist < min_dist) min_dist = dist; 
     if (dist > max_dist) max_dist = dist; 
    } 

    printf("-- Max dist : %f \n", max_dist); 
    printf("-- Min dist : %f \n", min_dist); 

    //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist) 
    std::vector<DMatch> good_matches; 

    for (int i = 0; i < descriptors_object.rows; i++) 
    { 
     if (matches[i].distance < 3 * min_dist) 
     { 
      good_matches.push_back(matches[i]); 
     } 
    } 

    Mat img_matches; 
    drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, 
     good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), 
     vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

    //-- Localize the object 
    std::vector<Point2f> obj; 
    std::vector<Point2f> scene; 

    for (int i = 0; i < good_matches.size(); i++) 
    { 
     //-- Get the keypoints from the good matches 
     obj.push_back(keypoints_object[good_matches[i].queryIdx].pt); 
     scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt); 
    } 

    Mat H = findHomography(obj, scene, CV_RANSAC); 

    //-- Get the corners from the image_1 (the object to be "detected") 
    std::vector<Point2f> obj_corners(4); 
    obj_corners[0] = cvPoint(0, 0); obj_corners[1] = cvPoint(img_object.cols, 0); 
    obj_corners[2] = cvPoint(img_object.cols, img_object.rows); obj_corners[3] = cvPoint(0, img_object.rows); 
    std::vector<Point2f> scene_corners(4); 

    perspectiveTransform(obj_corners, scene_corners, H); 

    //-- Draw lines between the corners (the mapped object in the scene - image_2) 
    line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 

    //-- Show detected matches 
    imshow("Good Matches & Object detection", img_matches); 

    waitKey(0); 
    return 0; 
} 

अद्यतन

OpenCV 3.0.0 एक अलग एपीआई है।

आप गैर-पेटेंट फीचर डिटेक्टर और डिस्क्रिप्टर एक्स्ट्रैक्टर here की एक सूची पा सकते हैं।

#include <iostream> 
#include <opencv2\opencv.hpp> 

using namespace cv; 

/** @function main */ 
int main(int argc, char** argv) 
{ 

    Mat img_object = imread("D:\\SO\\img\\box.png", CV_LOAD_IMAGE_GRAYSCALE); 
    Mat img_scene = imread("D:\\SO\\img\\box_in_scene.png", CV_LOAD_IMAGE_GRAYSCALE); 

    if (!img_object.data || !img_scene.data) 
    { 
     std::cout << " --(!) Error reading images " << std::endl; return -1; 
    } 

    //-- Step 1: Detect the keypoints using SURF Detector 
    Ptr<FeatureDetector> detector = ORB::create(); 

    std::vector<KeyPoint> keypoints_object, keypoints_scene; 

    detector->detect(img_object, keypoints_object); 
    detector->detect(img_scene, keypoints_scene); 

    //-- Step 2: Calculate descriptors (feature vectors) 
    Ptr<DescriptorExtractor> extractor = ORB::create(); 

    Mat descriptors_object, descriptors_scene; 

    extractor->compute(img_object, keypoints_object, descriptors_object); 
    extractor->compute(img_scene, keypoints_scene, descriptors_scene); 

    //-- Step 3: Matching descriptor vectors using FLANN matcher 
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce"); 
    std::vector<DMatch> matches; 
    matcher->match(descriptors_object, descriptors_scene, matches); 

    double max_dist = 0; double min_dist = 100; 

    //-- Quick calculation of max and min distances between keypoints 
    for (int i = 0; i < descriptors_object.rows; i++) 
    { 
     double dist = matches[i].distance; 
     if (dist < min_dist) min_dist = dist; 
     if (dist > max_dist) max_dist = dist; 
    } 

    printf("-- Max dist : %f \n", max_dist); 
    printf("-- Min dist : %f \n", min_dist); 

    //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist) 
    std::vector<DMatch> good_matches; 

    for (int i = 0; i < descriptors_object.rows; i++) 
    { 
     if (matches[i].distance < 3 * min_dist) 
     { 
      good_matches.push_back(matches[i]); 
     } 
    } 

    Mat img_matches; 

    drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

    //-- Localize the object 
    std::vector<Point2f> obj; 
    std::vector<Point2f> scene; 

    for (int i = 0; i < good_matches.size(); i++) 
    { 
     //-- Get the keypoints from the good matches 
     obj.push_back(keypoints_object[good_matches[i].queryIdx].pt); 
     scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt); 
    } 

    Mat H = findHomography(obj, scene, CV_RANSAC); 

    //-- Get the corners from the image_1 (the object to be "detected") 
    std::vector<Point2f> obj_corners(4); 
    obj_corners[0] = cvPoint(0, 0); obj_corners[1] = cvPoint(img_object.cols, 0); 
    obj_corners[2] = cvPoint(img_object.cols, img_object.rows); obj_corners[3] = cvPoint(0, img_object.rows); 
    std::vector<Point2f> scene_corners(4); 

    perspectiveTransform(obj_corners, scene_corners, H); 

    //-- Draw lines between the corners (the mapped object in the scene - image_2) 
    line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 

    //-- Show detected matches 
    imshow("Good Matches & Object detection", img_matches); 

    waitKey(0); 
    return 0; 
} 
+0

आप किस ओपनसीवी संस्करण का उपयोग कर रहे हैं? यह ओपनसीवी 2.4.9, और 2.4.11 – Miki

+0

में नवीनतम काम करता है, जो ओपनसीवी वेबसाइट पर आईओएस के लिए उपलब्ध है। – denis631

+0

'cv :: Feature2d' – denis631

संबंधित मुद्दे