Advertisement
Guest User

Untitled

a guest
Mar 21st, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. - (NSArray *)findObjectByTemple:(UIImage *)temple InFrameArray:(NSArray *)frameArray {
  2.    Mat templeMat = [self cvMatFromImage:temple];
  3.  
  4.    NSMutableArray *frameArrayWithDetectedTemple = [[NSMutableArray alloc] init];
  5.  
  6.    for (UIImage *frame in frameArray) {
  7.        Mat frameMat = [self cvMatFromImage:frame];
  8.  
  9.        //-- Step 1: Detect the keypoints using SURF Detector
  10.        Ptr<FeatureDetector> detector = ORB::create();
  11.  
  12.        vector<KeyPoint> keypointsTemple, keypointsFrame;
  13.  
  14.        detector->detect(templeMat, keypointsTemple);
  15.        detector->detect(frameMat, keypointsFrame);
  16.  
  17.        //-- Step 2: Calculate descriptors (feature vectors)
  18.        Ptr<DescriptorExtractor> extractor = ORB::create();
  19.  
  20.        Mat descriptorsTemple, descriptorsFrame;
  21.  
  22.        extractor->compute(templeMat, keypointsTemple, descriptorsTemple);
  23.        extractor->compute(frameMat, keypointsFrame, descriptorsFrame);
  24.  
  25.        //-- Step 3: Matching descriptor vectors using FLANN matcher
  26.        Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");
  27.        vector<DMatch> matches;
  28.        matcher->match(descriptorsTemple, descriptorsFrame, matches);
  29.  
  30.        double maxDist = 0;
  31.        double minDist = 100;
  32.  
  33.        //-- Quick calculation of max and min distances between keypoints
  34.        for (int i = 0; i < descriptorsTemple.rows; i++) {
  35.            double dist = matches[i].distance;
  36.            if (dist < minDist)
  37.                minDist = dist;
  38.            
  39.            if (dist > maxDist)
  40.                maxDist = dist;
  41.        }
  42.  
  43.        //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
  44.        vector<DMatch> goodMatches;
  45.  
  46.        for (int i = 0; i < descriptorsTemple.rows; i++) {
  47.            if (matches[i].distance < 3 * minDist) {
  48.                goodMatches.push_back(matches[i]);
  49.            }
  50.        }
  51.  
  52.        Mat imgMatches;
  53.        drawMatches(templeMat, keypointsTemple, frameMat, keypointsFrame, goodMatches, imgMatches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
  54.  
  55.        //-- Localize the object
  56.        vector<Point2f> object;
  57.        vector<Point2f> scene;
  58.  
  59.        for (int i = 0; i < goodMatches.size(); i++) {
  60.            //-- Get the keypoints from the good matches
  61.            object.push_back(keypointsTemple[goodMatches[i].queryIdx].pt);
  62.            scene.push_back(keypointsFrame[goodMatches[i].trainIdx].pt);
  63.        }
  64.  
  65.        Mat H = findHomography(object, scene, CV_RANSAC);
  66.  
  67.        //-- Get the corners from the image_1 ( the object to be "detected" )
  68.        vector<Point2f> objectCorners(4);
  69.        objectCorners[0] = cvPoint(0, 0);
  70.        objectCorners[1] = cvPoint(templeMat.cols, 0);
  71.        objectCorners[2] = cvPoint(templeMat.cols, templeMat.rows);
  72.        objectCorners[3] = cvPoint(0, templeMat.rows);
  73.        vector<Point2f> sceneCorners(4);
  74.  
  75.        perspectiveTransform(objectCorners, sceneCorners, H);
  76.  
  77.        //-- Draw lines between the corners (the mapped object in the scene - image_2 )
  78.        line(imgMatches, sceneCorners[0] + Point2f(templeMat.cols, 0), sceneCorners[1] + Point2f(templeMat.cols, 0), Scalar(0, 255, 0), 4);
  79.        line(imgMatches, sceneCorners[1] + Point2f(templeMat.cols, 0), sceneCorners[2] + Point2f(templeMat.cols, 0), Scalar(0, 255, 0), 4);
  80.        line(imgMatches, sceneCorners[2] + Point2f(templeMat.cols, 0), sceneCorners[3] + Point2f(templeMat.cols, 0), Scalar(0, 255, 0), 4);
  81.        line(imgMatches, sceneCorners[3] + Point2f(templeMat.cols, 0), sceneCorners[0] + Point2f(templeMat.cols, 0), Scalar(0, 255, 0), 4);
  82.  
  83.        //-- Show detected matches
  84.        [frameArrayWithDetectedTemple addObject:[self imageFromCVMat:imgMatches]];
  85.        break;
  86.    }
  87.    return frameArrayWithDetectedTemple;
  88. }
  89.  
  90. [12:29]  
  91. #import <opencv2/opencv.hpp>
  92. #include <opencv2/core/core.hpp>
  93. #include <opencv2/highgui/highgui.hpp>
  94. #include <opencv2/features2d/features2d.hpp>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement