Sundry tweaks to aos/vision libs

Change-Id: Ia5578dcf2d42ac53b81af239bf329eb084fcf1d9
diff --git a/aos/vision/blob/transpose.cc b/aos/vision/blob/transpose.cc
index 19ac965..72e1cc1 100644
--- a/aos/vision/blob/transpose.cc
+++ b/aos/vision/blob/transpose.cc
@@ -1,6 +1,7 @@
 #include "aos/vision/blob/transpose.h"
 
 #include <algorithm>
+#include <limits>
 
 namespace aos {
 namespace vision {
@@ -14,27 +15,30 @@
     kPointAdd = 3,
     kPointDel = 2,
   };
+  int min_y = std::numeric_limits<int>::max();
+  for (const std::vector<ImageRange> &row : img) {
+    if (!row.empty()) min_y = std::min(row[0].st, min_y);
+  }
+
   std::vector<std::vector<std::pair<int, EventT>>> events;
   int y = img.min_y();
   for (const std::vector<ImageRange> &row : img) {
     for (const ImageRange &range : row) {
-      if (range.ed >= static_cast<int>(events.size()))
-        events.resize(range.ed + 1);
-      events[range.st].emplace_back(y, kPointAdd);
-      events[range.ed].emplace_back(y, kPointDel);
+      if (range.ed - min_y >= static_cast<int>(events.size())) {
+        events.resize(range.ed - min_y + 1);
+      }
+      events[range.st - min_y].emplace_back(y, kPointAdd);
+      events[range.ed - min_y].emplace_back(y, kPointDel);
     }
     ++y;
   }
 
-  int min_y = 0;
-  while (min_y < (int)events.size() && events[min_y].empty()) ++min_y;
-
   std::vector<ImageRange> prev_ranges;
   std::vector<ImageRange> cur_ranges;
 
   std::vector<std::vector<ImageRange>> rows;
-  for (int y = min_y; y < static_cast<int>(events.size()) - 1; ++y) {
-    auto row_events = std::move(events[y]);
+  for (int dy = 0; dy < static_cast<int>(events.size()) - 1; ++dy) {
+    auto row_events = std::move(events[dy]);
     for (const auto &range : prev_ranges) {
       row_events.emplace_back(range.st, kRangeStart);
       row_events.emplace_back(range.ed, kRangeEnd);