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