Add a foothill finder

We were having some corners which were really close to primary corners
but also kinda high.  The fix for those is to ignore any peaks which
don't become small enough before running into previously counted peaks.
We call these peaks foothills.

Change-Id: I58243cd22d0ec9d224c48623551705ad5f3d1168
diff --git a/y2019/vision/target_sender.cc b/y2019/vision/target_sender.cc
index 80a47e0..f67cea1 100644
--- a/y2019/vision/target_sender.cc
+++ b/y2019/vision/target_sender.cc
@@ -307,8 +307,8 @@
     finder_.PreFilter(&imgs);
     LOG(INFO, "Blobs: (%zu).\n", imgs.size());
 
-    bool verbose = false;
-    std::vector<std::vector<Segment<2>>> raw_polys;
+    constexpr bool verbose = false;
+    ::std::vector<std::vector<Segment<2>>> raw_polys;
     for (const RangeImage &blob : imgs) {
       // Convert blobs to contours in the corrected space.
       ContourNode* contour = finder_.GetContour(blob);
@@ -323,17 +323,17 @@
     LOG(INFO, "Polygons: (%zu).\n", raw_polys.size());
 
     // Calculate each component side of a possible target.
-    std::vector<TargetComponent> target_component_list =
-        finder_.FillTargetComponentList(raw_polys);
+    ::std::vector<TargetComponent> target_component_list =
+        finder_.FillTargetComponentList(raw_polys, verbose);
     LOG(INFO, "Components: (%zu).\n", target_component_list.size());
 
     // Put the compenents together into targets.
-    std::vector<Target> target_list =
+    ::std::vector<Target> target_list =
         finder_.FindTargetsFromComponents(target_component_list, verbose);
     LOG(INFO, "Potential Target: (%zu).\n", target_list.size());
 
     // Use the solver to generate an intermediate version of our results.
-    std::vector<IntermediateResult> results;
+    ::std::vector<IntermediateResult> results;
     for (const Target &target : target_list) {
       results.emplace_back(finder_.ProcessTargetToResult(target, verbose));
     }