Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FFT based image registration (optionally using OpenCV) in cpp?

I'm trying to align two images taken from a handheld camera.

At first, I was trying to use the OpenCV warpPerspective method based on SIFT/SURF feature points. The problem is the feature-extract & matching process may be extremely slow when the image quality is high (3000x4000). I tried to scale-down the image before find feature-points, the result is not as good as before.(The Mat generated from findHomography shouldn't be affected by scaling down the image, right?) And sometimes, due to lack of good feature point matches, the result is quite strange.

After searching on this topic, it seems that solving the problem in Fourier domain will speed up the registration process. And I've found this question which leads me to the code here.

The only problem is the code is written in python with numpy (not even using OpenCV), which makes it quite hard to re-written to C++ code using OpenCV (In OpenCV, I can only find dft and there's no fftshift nor fft stuff, I'm not quite familiar with NumPy, and I'm not brave enough to simply ignore the missing methods). So I'm wondering why there is not such a Fourier-domain image registration implementation using C++?

Can you guys give me some suggestion on how to implement one, or give me a link to the already implemented C++ version? Or help me to turn the python code into C++ code?

Big thanks!

like image 230
Void Main Avatar asked Oct 02 '22 07:10

Void Main


2 Answers

I'm fairly certain that the FFT method can only recover a similarity transform, that is, only a (2d) rotation, translation and scale. Your results might not be that great using a handheld camera.

This is not quite a direct answer to your question, but, as a suggestion for a speed improvement, have you tried using a faster feature detector and descriptor? In OpenCV SIFT/SURF are some of the slowest methods they have for feature extraction/matching. You could try testing some of their other methods first, they all work quite well and are faster than SIFT/SURF. Especially if you use their FLANN-based matcher.

I've had to do this in the past with similar sized imagery, and using the binary descriptors OpenCV has increases the speed significantly.

like image 136
David Nilosek Avatar answered Oct 13 '22 12:10

David Nilosek


If you need only shift you can use OpenCV's phasecorrelate

like image 41
mrgloom Avatar answered Oct 13 '22 11:10

mrgloom