2013-02-14 4 views
2

Я пытаюсь работать с этим кодом, чтобы SURF можно было реализовать с использованием цветных кадров/изображений, а затем использовать код Kalman_Color_Object_Track для отслеживания обнаруженного объекта с использованием значения цвета от Kalman фильтр. Таким образом, эти шаги, которые я намерен сделать, но я застрял, поскольку этот код обнаружения SURF не принимает/работу с цветными изображениями:OpenCV: Проблемы с использованием цветовых кадров с функциями SURF

  1. «book1.png» является цветным изображением
  2. После прямоугольник вокруг изображения обнаруживается из поступающих кадров, структура Мата изменяется на IplImage поскольку код Kalman_Color_Object_Track в C++ с помощью

    dest_image = cvCloneImage (& (IplImage) изображений);

    mat_frame = cvCloneImage (& (IplImage));

  3. Вызов метода Kalman_Color_Object_Track(mat_frame,dest_image,30);.

Вопросы: (A) Как сделать этот код работать так, что функции SURF могут быть извлечены и обнаружены для цветных изображений? (B) Я не уверен, что должно быть передано в сигнатуре функции Kalman_Color_Object_Track() и (C), где именно в модуле обнаружения объекта он должен быть вызван?

 #include <stdio.h> 
    #include <iostream> 
    #include "opencv2/core/core.hpp" 
    #include "opencv2/features2d/features2d.hpp" 
    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/imgproc/imgproc.hpp" 
    #include "opencv2/calib3d/calib3d.hpp" 

    using namespace cv; 
    IplImage *mat_dest_image=0; 
    IplImage *mat_frame=0; 
/* Object Detection and recognition from video*/ 



    int main() 
    { 
     Mat object = imread("book1.png",); 

     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); 

      for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS 
      { 
       if((matches[i][0].distance < 0.6*(matches[i][1].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); 
    mat_dest_image=cvCloneImage(&(IplImage)image); 
    mat_frame=cvCloneImage(&(IplImage)frame); 

    Kalman_Color_Object_Track(); // The tracking method 
      } 

      //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); 

     } 
     return 0; 

    } 

ответ

1

This paper реализован дескриптор SIFT на цветных изображениях путем вычисления градиента гистограммы для каждого канала независимо друг от друга. Возможно, вы можете попробовать тот же подход для функций SURF.

+0

Благодарим вас за ссылку. Таким образом, невозможно настроить этот код для сопоставления цветов? Я надеялся, что с кодом можно что-то сделать. И, если не работать с цветовыми свойствами, как и где я должен подключиться к калмановскому фильтру? –

+0

Если вы разделите изображение на каналы и вычислите 3 набора дескрипторов, по одному для каждого канала и выполните сопоставление на каждом наборе, вы можете получить что-то полезное. –

+0

Хорошо. Можете ли вы поместить код для разделения на каждый канал? Кроме того, где должен быть размещен вызов модуля отслеживания? Спасибо. –

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