2013-02-19 5 views
0

Я только что отважился на компьютерное зрение и попытался демистифицировать различные тонкости этого. Я пытаюсь увеличить фильтр калмана с помощью функции обнаружения прибоя. Но я не понимаю, как вызвать и использовать метод kalman после того, как гомография и ограниченный прямоугольник были построены на обнаруженном кадре с использованием функций серфинга. Я обнаружил функции и извлек ключевые точки с помощью эталонного изображения после сравнения с входящими кадрами. Затем я использовал совпадение фланов.OpenCV: обнаружение и отслеживание объектов на основе обнаружения объектов

Теперь, возможно использовать фильтр kalman, так как я хочу отслеживать движение и получать предсказанное движение. Я много искал, но не нашел, что функции серфинга можно использовать с фильтром kalman. Все, что я получаю, - это предложения по использованию cvBlobs для отслеживания. Но, теоретически, фильтры кальмана используются для отслеживания. Тем не менее, я запутался, так как несколько реализаций отслеживания на основе видео с использованием серфинга показывают, что серфинг может использоваться для отслеживания сам по себе. Но мой вопрос

  • Если фильтр Калмана не может быть использован с прибой, то как я могу реализовать моменты, чтобы получить измеренные значения координат, как мне нужна информация для предсказания движения.

  • можно использовать серфинг с фильтром kalman для отслеживания, и если да, то как реализовать его после обнаружения и ограничения объекта с помощью прямоугольника, используя следующий код.

    Пример: объект для отслеживания book1.png. Некоторые кадры frame1rame2

    /* Объект обнаружения и распознавания из видео */

    INT Основной() { Мат объект = imread ("book1.png", CV_LOAD_IMAGE_GRAYSCALE);

    if(!object.data) 
    { 
        std::cout<< "Error reading object " << std::endl; 
        return -1; 
    } 
    
    //Detect the keypoints using SURF Detector 
    int minHessian = 500; 
    
    SurfFeatureDetector detector(minHessian); 
    std::vector<KeyPoint> kp_object; 
    
    detector.detect(object, kp_object); 
    
    //Calculate descriptors (feature vectors) 
    SurfDescriptorExtractor extractor; 
    Mat des_object; 
    
    extractor.compute(object, kp_object, des_object); 
    
    FlannBasedMatcher matcher;   
    
    namedWindow("Good Matches"); 
    namedWindow("Tracking"); 
    
    std::vector<Point2f> obj_corners(4); 
    
    //Get the corners from the object 
    obj_corners[0] = cvPoint(0,0); 
    obj_corners[1] = cvPoint(object.cols, 0); 
    obj_corners[2] = cvPoint(object.cols, object.rows); 
    obj_corners[3] = cvPoint(0, object.rows); 
    
    char key = 'a'; 
    int framecount = 0; 
    VideoCapture cap("booksvideo.avi"); 
    
    for(; ;) 
    { 
        Mat frame; 
        cap >> frame; 
        imshow("Good Matches", frame); 
    
    
        Mat des_image, img_matches; 
        std::vector<KeyPoint> kp_image; 
        std::vector<vector<DMatch > > matches; 
        std::vector<DMatch > good_matches; 
        std::vector<Point2f> obj; 
        std::vector<Point2f> scene; 
        std::vector<Point2f> scene_corners(4); 
        Mat H; 
        Mat image; 
    
        //cvtColor(frame, image, CV_RGB2GRAY); 
    
        detector.detect(image, kp_image); 
        extractor.compute(image, kp_image, des_image); 
    
        matcher.knnMatch(des_object, des_image, matches, 2); 
    
        //THIS LOOP IS SENSITIVE TO SEGFAULTS 
        for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) 
        { 
         if((matches[i][0].distance < 0.6*(matches[i][4].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0)) 
         { 
          good_matches.push_back(matches[i][0]); 
         } 
        } 
    
        //Draw only "good" matches 
        drawMatches(object, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 
    
        if (good_matches.size() >= 4) 
        { 
         for(int i = 0; i < good_matches.size(); i++) 
         { 
          //Get the keypoints from the good matches 
          obj.push_back(kp_object[ good_matches[i].queryIdx ].pt); 
          scene.push_back(kp_image[ good_matches[i].trainIdx ].pt); 
         } 
    
         H = findHomography(obj, scene, CV_RANSAC); 
    
         perspectiveTransform(obj_corners, scene_corners, H); 
    
         //Draw lines between the corners (the mapped object in the scene image) 
         line(img_matches, scene_corners[0] + Point2f(object.cols, 0), scene_corners[1] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); 
         line(img_matches, scene_corners[1] + Point2f(object.cols, 0), scene_corners[2] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); 
         line(img_matches, scene_corners[2] + Point2f(object.cols, 0), scene_corners[3] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); 
         line(img_matches, scene_corners[3] + Point2f(object.cols, 0), scene_corners[0] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); 
    
        } 
    
        //Show detected matches 
        imshow("Good Matches", img_matches); 
        for(int i = 0; i < good_matches.size(); i++) 
        { 
         printf("-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx); 
        } 
    
        waitKey(0); 
    

    }

    возврат 0;

    }

ответ

2

Я не видел сочетание соответствия функций и фильтрации, что вы описываете. Одна из моих идей заключалась в том, чтобы отслеживать центр масс (и размер) с помощью фильтра калмана и использовать эту информацию для маскировки внешней области перед запуском соответствия функции на следующем кадре. Я не уверен, каковы ваши ограничения, но вы можете рассмотреть возможность сопоставления шаблонов или отслеживания типа camshift, которые также могут использовать фильтр kalman для помощи при поиске.

+1

Хорошо, так как я могу использовать camshift с прибоем? Я нашел этот код http://opencv-srf.blogspot.ca/2010/09/object-detection-using-color-seperation.html, который использует значения цвета. Тем не менее, серфинг здесь работает на изображениях с серой шкалой. Так что, даже если я использую серовую шкалу, то как мне реализовать camshift после обнаружения объекта ограниченных прямоугольников с помощью surf. Я буду очень признателен, если вы можете поместить фрагмент кода, так как я не знаю, как вычислить центроид и работать с camshift и surf. –

+0

Я также нашел аналогичный вопрос http://stackoverflow.com/questions/9701276/opencv-tracking-using-optical-flow/9702540#comment13031247_9702540, но, я думаю, он не использует серфинг. Итак, я подумал, можно ли объединить серфинг с https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/motempl.c?rev=1429, но тогда это находится в C ! Если я сменил изображения серфинга с Mat на IplImage, то что должно идти в вызове функции update_mhi (IplImage * img, IplImage * dst, int diff_threshold) и где я должен вызывать update_mhi() в модуле серфинга. Пожалуйста помоги. –

+0

Основная цель заключается в том, что мне нужно найти координаты обнаруженного объекта, который, как я думаю, может быть сделан с помощью моментов. Я не знаю, как увеличить момент с обнаружением функции поиска, чтобы можно было предсказать предсказанное движение. –

Смежные вопросы