blob: 201ffb272dccbe79aed3146fba8047f9b48b5d2a [file] [log] [blame]
Parker Schuh6691f192017-01-14 17:01:02 -08001#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
8namespace aos {
9namespace vision {
10
11struct Point {
12 int x;
13 int y;
14};
15
16struct 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; }
Brian Silverman5eec8b92019-03-10 15:14:31 -070024 bool operator==(const ImageRange &other) const {
25 return st == other.st && ed == other.ed;
26 }
27 bool operator!=(const ImageRange &other) const { return !(*this == other); }
Parker Schuh6691f192017-01-14 17:01:02 -080028};
29
Brian Silverman5eec8b92019-03-10 15:14:31 -070030void PrintTo(const ImageRange &range, std::ostream *os);
31
Parker Schuh6691f192017-01-14 17:01:02 -080032// Image in pre-thresholded run-length encoded format.
33class RangeImage {
34 public:
35 RangeImage(int min_y, std::vector<std::vector<ImageRange>> &&ranges)
36 : min_y_(min_y), ranges_(std::move(ranges)) {}
37 explicit RangeImage(int l) { ranges_.reserve(l); }
38 RangeImage() {}
39
Brian Silverman5eec8b92019-03-10 15:14:31 -070040 bool operator==(const RangeImage &other) const {
41 if (min_y_ != other.min_y_) { return false; }
42 if (ranges_ != other.ranges_) { return false; }
43 return true;
44 }
45 bool operator!=(const RangeImage &other) const { return !(*this == other); }
46
Parker Schuh6691f192017-01-14 17:01:02 -080047 int size() const { return ranges_.size(); }
48
49 int npixels();
50 int calc_area() const;
51
52 void Flip(ImageFormat fmt) { Flip(fmt.w, fmt.h); }
53 void Flip(int image_width, int image_height);
54
55 std::vector<std::vector<ImageRange>>::const_iterator begin() const {
56 return ranges_.begin();
57 }
58
59 std::vector<std::vector<ImageRange>>::const_iterator end() const {
60 return ranges_.end();
61 }
62
63 const std::vector<std::vector<ImageRange>> &ranges() const { return ranges_; }
64
65 int min_y() const { return min_y_; }
66
67 int mini() const { return min_y_; }
68
Parker Schuh0ff777c2017-02-19 15:01:13 -080069 int height() const { return min_y_ + ranges_.size(); }
70
Parker Schuh6691f192017-01-14 17:01:02 -080071 private:
72 // minimum index in y where the blob starts
73 int min_y_ = 0;
74
Brian Silverman5eec8b92019-03-10 15:14:31 -070075 // Each vector<ImageRange> represents all the matched ranges in a given row.
76 // Each ImageRange within that row represents a run of pixels which matches.
Parker Schuh6691f192017-01-14 17:01:02 -080077 std::vector<std::vector<ImageRange>> ranges_;
78
79 // Cached pixel count.
80 int npixelsc_ = -1;
81};
82
Brian Silverman5eec8b92019-03-10 15:14:31 -070083void PrintTo(const RangeImage &range, std::ostream *os);
84
Parker Schuh6691f192017-01-14 17:01:02 -080085typedef std::vector<RangeImage> BlobList;
86typedef std::vector<const RangeImage *> BlobLRef;
87
88void DrawRangeImage(const RangeImage &rimg, ImagePtr outbuf, PixelRef color);
89
90// Merge sort of multiple range images into a single range image.
91// They must not overlap.
92RangeImage MergeRangeImage(const BlobList &blobl);
93
94// Debug print range image as ranges.
95std::string ShortDebugPrint(const BlobList &blobl);
96// Debug print range image as ### for the ranges.
97void DebugPrint(const BlobList &blobl);
98
99} // namespace vision
100} // namespace aos
101
102#endif // _AOS_VISION_BLOB_RANGE_IMAGE_H_