\subsection{Points detection and matching}
\label{detection}
\subsubsection{Points detection}

As a first step the detection of keypoints was made by using SURF (Speeded-Up Robust Features) algorithm (provided by 
OpenCV) because of its good 
speed but this algorithm is computed in nonfree module which is not free to use in commercial 
application. That is why we decided to choose the BRISK (Binary Robust Invariant Scalable Keypoints)
algorithm (also provided by OpenCV) is pretty close to the SIFT (Scale-invariant feature transform) algorithm.
Therefore the tests were made using SURF and BRISK algorithm but the final version is with BRISK as SURF is patented. 
As the aera of interest in the images is the object, we provide a binary mask (computed during the segmentation) in input of
SURF and BRISK detectors.


SURF is a speed version of SIFT (see Figure \ref{siftSurf}). Indeed instead of approximate Laplacian of Gaussian (LoG) with Difference 
of Gaussian for finding scale-space. SURF goes a little further and approximates LoG with Box Filter.

\begin{figure}[H]
  \centering
  \includegraphics[scale=0.45]{img/LapinSiftSurf}
  \caption{\label{siftSurf}Points detection for SIFT and SURF algorithm}
\end{figure}

For BRISK (see Figure \ref{brisk3415}) points of interest are identified across both the image and scale dimensions using a saliency criterion. 
In order to increase the speed of computation, keypoints are detected in octave layers of the image pyramid as well as
in layers in-between. The location and the scale of each keypoint are obtained in the continuous domain via quadratic function fitting.
A sampling pattern consisting of points lying on appropriately scaled concentric circles is applied at the neighborhood of each keypoint to retrieve
gray values. Finally, the oriented BRISK sampling pattern is used to obtain pairwise brightness comparison results which are 
assembled into the binary BRISK descriptor. The BRISK constructor take in input three parameters which modify the results : 
the thresh, the octave and the patternScale.


A detailed explanation of these algorithms can be found with the references \cite{brisk} (BRISK), \cite{surf} (SURF) and
\cite{sift} (SIFT).

\begin{figure}[H]
  \centering
  \includegraphics[scale=0.45]{img/brisk3415}
  \caption{\label{brisk3415}Detected points with BRISK algorithm}
\end{figure}
	

\subsubsection{Points matching}

We did the points matching, using a brute force matcher provided by OpenCV and then applied filters to get rid of inaccurate points.
For each descriptor in the first set, this matcher finds the closest descriptor in the second set by trying each one.
The filters used are :
\begin{itemize}
  \item symmetric filter : the matches found when we take the image\_1 as base need to be found when we take the image\_2 as base also.
  \item order constraint : the position of each point is compared to each other in image\_1 and image\_2, if there is too much error these points
			  are deleted.
  \item threshold filter : filter on the distance between the descriptors of the matching points. This filter is not used with BRISK 
			    detection because the results are quite good without it.
  \item geometric filter : filter which use epipolar geometry, and the fundamental matrix to filter strange points.
\end{itemize}


\begin{figure}[H]
  \centering
  \includegraphics[scale=0.45]{img/LapinSymetricGeometric}
  \caption{Points matching obtained after symmetric and geometric filtering}
\end{figure}
