Checking in blob routines.

Change-Id: I364331d6f9239763ccac492460ed752a0b16871f
diff --git a/aos/vision/blob/stream_view.h b/aos/vision/blob/stream_view.h
new file mode 100644
index 0000000..9d63e8d
--- /dev/null
+++ b/aos/vision/blob/stream_view.h
@@ -0,0 +1,73 @@
+#ifndef _AOS_VISION_BLOB_STREAM_VIEW_H_
+#define _AOS_VISION_BLOB_STREAM_VIEW_H_
+
+#include "aos/vision/blob/range_image.h"
+#include "aos/vision/debug/debug_viewer.h"
+#include "aos/vision/image/image_types.h"
+
+#include <memory>
+
+namespace aos {
+namespace vision {
+
+class BlobStreamViewer {
+ public:
+  BlobStreamViewer() : view_(false) {}
+  void Submit(ImageFormat fmt, const BlobList &blob_list) {
+    SetFormatAndClear(fmt);
+    DrawBlobList(blob_list, {255, 255, 255});
+  }
+
+  inline void SetFormatAndClear(ImageFormat fmt) {
+    if (fmt.w != ptr_.fmt().w || fmt.h != ptr_.fmt().h) {
+      printf("resizing data: %d, %d\n", fmt.w, fmt.h);
+      outbuf_.reset(new PixelRef[fmt.ImgSize()]);
+      ptr_ = ImagePtr{fmt, outbuf_.get()};
+      view_.UpdateImage(ptr_);
+    }
+    memset(ptr_.data(), 0, fmt.ImgSize() * sizeof(PixelRef));
+  }
+
+  inline void DrawBlobList(const BlobList &blob_list, PixelRef color) {
+    for (const auto &blob : blob_list) {
+      for (int i = 0; i < (int)blob.ranges.size(); ++i) {
+        for (const auto &range : blob.ranges[i]) {
+          for (int j = range.st; j < range.ed; ++j) {
+            ptr_.get_px(j, i + blob.min_y) = color;
+          }
+        }
+      }
+    }
+  }
+
+  inline void DrawSecondBlobList(const BlobList &blob_list, PixelRef color1,
+                                 PixelRef color2) {
+    for (const auto &blob : blob_list) {
+      for (int i = 0; i < (int)blob.ranges.size(); ++i) {
+        for (const auto &range : blob.ranges[i]) {
+          for (int j = range.st; j < range.ed; ++j) {
+            auto px = ptr_.get_px(j, i + blob.min_y);
+            if (px.r == 0 && px.g == 0 && px.b == 0) {
+              ptr_.get_px(j, i + blob.min_y) = color1;
+            } else {
+              ptr_.get_px(j, i + blob.min_y) = color2;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  DebugViewer *view() { return &view_; }
+
+ private:
+  std::unique_ptr<PixelRef[]> outbuf_;
+  ImagePtr ptr_;
+
+  DebugViewer view_;
+};
+
+}  // namespace vision
+}  // namespace aos
+
+#endif  // _AOS_VISION_BLOB_STREAM_VIEW_H_