geophotologist
geophotologist

Reputation: 45

SURF feature detection for linear panoramas OpenCV

I have started on a project to create linear/ strip panorama's of long scenes using video. This meaning that the panorama doesn't revolve around a center but move parallel to a scene eg. vid cam mounted on a vehicle looking perpendicular to the street facade.

The steps I will be following are:

  1. capture frames from video
  2. Feature detection - (SURF)
  3. Feature tracking (Kanade-Lucas-Tomasi)
  4. Homography estimation
  5. Stitching Mosaic.

So far I have been able to save individual frames from video and complete SURF feature detection on only two images. I am not asking for someone to solve my entire project but I am stuck trying complete the SURF detection on the remaing frames captured.

Question: How do I apply SURF detection to successive frames? Do I save it as a YAML or xml?

For my feature detection I used OpenCV's sample find_obj.cpp and just changed the images used.

Has anyone experienced such a project? An example of what I would like to achieve is from Iwane technologies http://www.iwane.com/en/2dpcci.php

Upvotes: 2

Views: 873

Answers (1)

sansuiso
sansuiso

Reputation: 9379

While working on a similar project, I created an std::vector of SURF keypoints (both points and descriptors) then used them to compute the pairwise matchings. The vector was filled while reading frame-by-frame a movie, but it works the same with a sequence of images.

There are not enough points to saturate your memory (and use yml/xml files) unless you have very limited resources or a very very long sequence.

Note that you do not need the feature tracking part, at least in most standard cases: SURF descriptors matching can also provide you an homography estimate (without the need for tracking).

Reading to a vector

Start by declaring a vector of Mat's, for example std::vector<cv::Mat> my_sequence;. Then, you have two choices:

  1. either you know the number of frames, then you resize the vector to the correct size. Then, for each frame, read the image to some variable and copy it to the correct place in the sequence, using my_sequence.at(i) = frame.clone(); or frame.copyTo(my_sequence.at(i));

  2. or you don't know the size beforehand, and you simply call the push_back() method as usual: my_sequence.push_back(frame);

Upvotes: 1

Related Questions