Make SIFT faster

This uses various halide-optimized functions to do the actual image
processing. It still finds around the same number of features, but much
faster.

Change-Id: I9d7f7093b0ec41acf7ed16b2c91cdadada2f9a22
diff --git a/y2020/vision/sift/sift971.h b/y2020/vision/sift/sift971.h
index d58dec8..b351d70 100644
--- a/y2020/vision/sift/sift971.h
+++ b/y2020/vision/sift/sift971.h
@@ -41,6 +41,10 @@
                             int nOctaves) const;
   void buildDoGPyramid(const std::vector<cv::Mat> &pyr,
                        std::vector<cv::Mat> &dogpyr) const;
+  void buildGaussianAndDifferencePyramid(const cv::Mat &base,
+                                         std::vector<cv::Mat> &pyr,
+                                         std::vector<cv::Mat> &dogpyr,
+                                         int nOctaves) const;
   void findScaleSpaceExtrema(const std::vector<cv::Mat> &gauss_pyr,
                              const std::vector<cv::Mat> &dog_pyr,
                              std::vector<cv::KeyPoint> &keypoints) const;
@@ -51,6 +55,15 @@
   CV_PROP_RW double contrastThreshold;
   CV_PROP_RW double edgeThreshold;
   CV_PROP_RW double sigma;
+
+ private:
+  cv::Mat createInitialImage(const cv::Mat &img, bool doubleImageSize) const;
+
+  bool use_fast_gaussian_pyramid_ = true;
+  bool use_fast_subtract_dogpyr_ = true;
+  bool use_fast_guassian_initial_ = true;
+  bool use_fused_pyramid_difference_ = true;
+  bool use_fast_pyramid_difference_ = true;
 };
 
 }  // namespace vision