blob: 109a100139f5b9225e332d5f203573a2774812c4 [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
56 private:
57 // minimum index in y where the blob starts
58 int min_y_ = 0;
59
60 // ranges are always sorted in y then x order
61 std::vector<std::vector<ImageRange>> ranges_;
62
63 // Cached pixel count.
64 int npixelsc_ = -1;
65};
66
67typedef std::vector<RangeImage> BlobList;
68typedef std::vector<const RangeImage *> BlobLRef;
69
70void DrawRangeImage(const RangeImage &rimg, ImagePtr outbuf, PixelRef color);
71
72// Merge sort of multiple range images into a single range image.
73// They must not overlap.
74RangeImage MergeRangeImage(const BlobList &blobl);
75
76// Debug print range image as ranges.
77std::string ShortDebugPrint(const BlobList &blobl);
78// Debug print range image as ### for the ranges.
79void DebugPrint(const BlobList &blobl);
80
81} // namespace vision
82} // namespace aos
83
84#endif // _AOS_VISION_BLOB_RANGE_IMAGE_H_