Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 1 | #ifndef _AOS_VISION_BLOB_RANGE_IMAGE_H_ |
| 2 | #define _AOS_VISION_BLOB_RANGE_IMAGE_H_ |
| 3 | |
| 4 | #include <vector> |
| 5 | |
| 6 | #include "aos/vision/image/image_types.h" |
| 7 | |
| 8 | namespace aos { |
| 9 | namespace vision { |
| 10 | |
| 11 | struct Point { |
| 12 | int x; |
| 13 | int y; |
| 14 | }; |
| 15 | |
| 16 | struct ImageRange { |
| 17 | ImageRange(int a, int b) : st(a), ed(b) {} |
| 18 | int st; |
| 19 | int ed; |
| 20 | int last() const { return ed - 1; } |
| 21 | int calc_width() const { return ed - st; } |
| 22 | |
| 23 | bool operator<(const ImageRange &o) const { return st < o.st; } |
| 24 | }; |
| 25 | |
| 26 | // Image in pre-thresholded run-length encoded format. |
| 27 | class RangeImage { |
| 28 | public: |
| 29 | RangeImage(int min_y, std::vector<std::vector<ImageRange>> &&ranges) |
| 30 | : min_y_(min_y), ranges_(std::move(ranges)) {} |
| 31 | explicit RangeImage(int l) { ranges_.reserve(l); } |
| 32 | RangeImage() {} |
| 33 | |
| 34 | int size() const { return ranges_.size(); } |
| 35 | |
| 36 | int npixels(); |
| 37 | int calc_area() const; |
| 38 | |
| 39 | void Flip(ImageFormat fmt) { Flip(fmt.w, fmt.h); } |
| 40 | void Flip(int image_width, int image_height); |
| 41 | |
| 42 | std::vector<std::vector<ImageRange>>::const_iterator begin() const { |
| 43 | return ranges_.begin(); |
| 44 | } |
| 45 | |
| 46 | std::vector<std::vector<ImageRange>>::const_iterator end() const { |
| 47 | return ranges_.end(); |
| 48 | } |
| 49 | |
| 50 | const std::vector<std::vector<ImageRange>> &ranges() const { return ranges_; } |
| 51 | |
| 52 | int min_y() const { return min_y_; } |
| 53 | |
| 54 | int mini() const { return min_y_; } |
| 55 | |
Parker Schuh | 0ff777c | 2017-02-19 15:01:13 -0800 | [diff] [blame^] | 56 | int height() const { return min_y_ + ranges_.size(); } |
| 57 | |
Parker Schuh | 6691f19 | 2017-01-14 17:01:02 -0800 | [diff] [blame] | 58 | private: |
| 59 | // minimum index in y where the blob starts |
| 60 | int min_y_ = 0; |
| 61 | |
| 62 | // ranges are always sorted in y then x order |
| 63 | std::vector<std::vector<ImageRange>> ranges_; |
| 64 | |
| 65 | // Cached pixel count. |
| 66 | int npixelsc_ = -1; |
| 67 | }; |
| 68 | |
| 69 | typedef std::vector<RangeImage> BlobList; |
| 70 | typedef std::vector<const RangeImage *> BlobLRef; |
| 71 | |
| 72 | void DrawRangeImage(const RangeImage &rimg, ImagePtr outbuf, PixelRef color); |
| 73 | |
| 74 | // Merge sort of multiple range images into a single range image. |
| 75 | // They must not overlap. |
| 76 | RangeImage MergeRangeImage(const BlobList &blobl); |
| 77 | |
| 78 | // Debug print range image as ranges. |
| 79 | std::string ShortDebugPrint(const BlobList &blobl); |
| 80 | // Debug print range image as ### for the ranges. |
| 81 | void DebugPrint(const BlobList &blobl); |
| 82 | |
| 83 | } // namespace vision |
| 84 | } // namespace aos |
| 85 | |
| 86 | #endif // _AOS_VISION_BLOB_RANGE_IMAGE_H_ |