Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 1 | #ifndef _AOS_VISION_BLOB_STREAM_VIEW_H_ |
| 2 | #define _AOS_VISION_BLOB_STREAM_VIEW_H_ |
| 3 | |
| 4 | #include "aos/vision/blob/range_image.h" |
Parker Schuh | ef47dbf | 2017-03-04 16:59:30 -0800 | [diff] [blame] | 5 | #include "aos/vision/debug/debug_window.h" |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 6 | #include "aos/vision/image/image_types.h" |
| 7 | |
| 8 | #include <memory> |
| 9 | |
| 10 | namespace aos { |
| 11 | namespace vision { |
| 12 | |
Parker Schuh | ef47dbf | 2017-03-04 16:59:30 -0800 | [diff] [blame] | 13 | class BlobStreamViewer : public DebugWindow { |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 14 | public: |
Parker Schuh | ef47dbf | 2017-03-04 16:59:30 -0800 | [diff] [blame] | 15 | BlobStreamViewer() : DebugWindow(false) {} |
| 16 | explicit BlobStreamViewer(bool flip) : DebugWindow(flip) {} |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 17 | |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 18 | void Submit(ImageFormat fmt, const BlobList &blob_list) { |
| 19 | SetFormatAndClear(fmt); |
| 20 | DrawBlobList(blob_list, {255, 255, 255}); |
| 21 | } |
| 22 | |
| 23 | inline void SetFormatAndClear(ImageFormat fmt) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 24 | if (!image_.fmt().Equals(fmt)) { |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 25 | printf("resizing data: %d, %d\n", fmt.w, fmt.h); |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 26 | image_ = ImageValue(fmt); |
| 27 | UpdateImage(image_.get()); |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 28 | } |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 29 | memset(image_.data(), 0, fmt.ImgSize() * sizeof(PixelRef)); |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 30 | } |
| 31 | |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 32 | template <typename PixelCallback> |
| 33 | inline void ForPxInBlobList(const BlobList &blob_list, |
| 34 | PixelCallback pixel_callback) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 35 | ImagePtr ptr = img(); |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 36 | auto fmt = ptr.fmt(); |
| 37 | for (const auto &blob : blob_list) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 38 | for (int i = 0; i < (int)blob.ranges().size(); ++i) { |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 39 | int y = blob.min_y() + i; |
| 40 | if (y >= 0 && y < fmt.h) { |
| 41 | for (const auto &range : blob.ranges()[i]) { |
| 42 | for (int j = std::max(0, range.st); j < std::min(fmt.w, range.ed); |
| 43 | ++j) { |
| 44 | pixel_callback(ptr.get_px(j, y)); |
| 45 | } |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 46 | } |
| 47 | } |
| 48 | } |
| 49 | } |
| 50 | } |
| 51 | |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 52 | inline void DrawBlobList(const BlobList &blob_list, PixelRef color) { |
| 53 | ForPxInBlobList(blob_list, [&](PixelRef &px) { px = color; }); |
| 54 | } |
| 55 | |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 56 | inline void DrawSecondBlobList(const BlobList &blob_list, PixelRef color1, |
| 57 | PixelRef color2) { |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 58 | ForPxInBlobList(blob_list, [&](PixelRef &px) { |
| 59 | if (px.r == 0 && px.g == 0 && px.b == 0) { |
| 60 | px = color1; |
| 61 | } else { |
| 62 | px = color2; |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 63 | } |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 64 | }); |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 65 | } |
| 66 | |
Parker Schuh | 0ff777c | 2017-02-19 15:01:13 -0800 | [diff] [blame] | 67 | inline void DrawSecondBlobList(const BlobList &blob_list, PixelRef color1, |
| 68 | PixelRef color2, PixelRef prev_color) { |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 69 | ForPxInBlobList(blob_list, [&](PixelRef &px) { |
| 70 | if (px.r == prev_color.r && px.g == prev_color.g && |
| 71 | px.b == prev_color.b) { |
| 72 | px = color2; |
| 73 | } else { |
| 74 | px = color1; |
Parker Schuh | 0ff777c | 2017-02-19 15:01:13 -0800 | [diff] [blame] | 75 | } |
Parker Schuh | 309dd72 | 2017-02-25 11:31:18 -0800 | [diff] [blame] | 76 | }); |
Parker Schuh | 0ff777c | 2017-02-19 15:01:13 -0800 | [diff] [blame] | 77 | } |
| 78 | |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 79 | // Backwards compatible. |
Parker Schuh | ef47dbf | 2017-03-04 16:59:30 -0800 | [diff] [blame] | 80 | DebugWindow *view() { return this; } |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 81 | |
| 82 | ImagePtr img() { return image_.get(); } |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 83 | |
| 84 | private: |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 85 | ImageValue image_; |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 86 | }; |
| 87 | |
| 88 | } // namespace vision |
| 89 | } // namespace aos |
| 90 | |
| 91 | #endif // _AOS_VISION_BLOB_STREAM_VIEW_H_ |