blob: 3647890173f6d754b0adb2b3830f6bccb02400e4 [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; }
24};
25
26// Image in pre-thresholded run-length encoded format.
27class 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 Schuh0ff777c2017-02-19 15:01:13 -080056 int height() const { return min_y_ + ranges_.size(); }
57
Parker Schuh6691f192017-01-14 17:01:02 -080058 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
69typedef std::vector<RangeImage> BlobList;
70typedef std::vector<const RangeImage *> BlobLRef;
71
72void 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.
76RangeImage MergeRangeImage(const BlobList &blobl);
77
78// Debug print range image as ranges.
79std::string ShortDebugPrint(const BlobList &blobl);
80// Debug print range image as ### for the ranges.
81void DebugPrint(const BlobList &blobl);
82
83} // namespace vision
84} // namespace aos
85
86#endif // _AOS_VISION_BLOB_RANGE_IMAGE_H_