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" |
| 5 | #include "aos/vision/debug/debug_viewer.h" |
| 6 | #include "aos/vision/image/image_types.h" |
| 7 | |
| 8 | #include <memory> |
| 9 | |
| 10 | namespace aos { |
| 11 | namespace vision { |
| 12 | |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 13 | class BlobStreamViewer : public DebugViewer { |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 14 | public: |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 15 | BlobStreamViewer() : DebugViewer(false) {} |
| 16 | explicit BlobStreamViewer(bool flip) : DebugViewer(flip) {} |
| 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 | |
| 32 | inline void DrawBlobList(const BlobList &blob_list, PixelRef color) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 33 | ImagePtr ptr = img(); |
| 34 | for (const RangeImage &blob : blob_list) { |
| 35 | for (int i = 0; i < (int)blob.ranges().size(); ++i) { |
| 36 | for (const auto &range : blob.ranges()[i]) { |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 37 | for (int j = range.st; j < range.ed; ++j) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 38 | ptr.get_px(j, i + blob.min_y()) = color; |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 39 | } |
| 40 | } |
| 41 | } |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | inline void DrawSecondBlobList(const BlobList &blob_list, PixelRef color1, |
| 46 | PixelRef color2) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 47 | ImagePtr ptr = img(); |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 48 | for (const auto &blob : blob_list) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 49 | for (int i = 0; i < (int)blob.ranges().size(); ++i) { |
| 50 | for (const auto &range : blob.ranges()[i]) { |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 51 | for (int j = range.st; j < range.ed; ++j) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 52 | auto px = ptr.get_px(j, i + blob.min_y()); |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 53 | if (px.r == 0 && px.g == 0 && px.b == 0) { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 54 | ptr.get_px(j, i + blob.min_y()) = color1; |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 55 | } else { |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 56 | ptr.get_px(j, i + blob.min_y()) = color2; |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 57 | } |
| 58 | } |
| 59 | } |
| 60 | } |
| 61 | } |
| 62 | } |
| 63 | |
Parker Schuh | 0ff777c | 2017-02-19 15:01:13 -0800 | [diff] [blame^] | 64 | inline void DrawSecondBlobList(const BlobList &blob_list, PixelRef color1, |
| 65 | PixelRef color2, PixelRef prev_color) { |
| 66 | ImagePtr ptr = img(); |
| 67 | for (const auto &blob : blob_list) { |
| 68 | for (int i = 0; i < (int)blob.ranges().size(); ++i) { |
| 69 | for (const auto &range : blob.ranges()[i]) { |
| 70 | for (int j = range.st; j < range.ed; ++j) { |
| 71 | auto px = ptr.get_px(j, i + blob.min_y()); |
| 72 | if (px.r == prev_color.r && px.g == prev_color.g && |
| 73 | px.b == prev_color.b) { |
| 74 | ptr.get_px(j, i + blob.min_y()) = color2; |
| 75 | } else { |
| 76 | ptr.get_px(j, i + blob.min_y()) = color1; |
| 77 | } |
| 78 | } |
| 79 | } |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 | |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 84 | // Backwards compatible. |
| 85 | DebugViewer *view() { return this; } |
| 86 | |
| 87 | ImagePtr img() { return image_.get(); } |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 88 | |
| 89 | private: |
Parker Schuh | d7db83d | 2017-02-08 20:49:15 -0800 | [diff] [blame] | 90 | ImageValue image_; |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 91 | }; |
| 92 | |
| 93 | } // namespace vision |
| 94 | } // namespace aos |
| 95 | |
| 96 | #endif // _AOS_VISION_BLOB_STREAM_VIEW_H_ |