blob: 20bf87a322588767b7d8d714e8aa56eee9a78b69 [file] [log] [blame]
Parker Schuh2a1447c2019-02-17 00:25:29 -08001#ifndef _Y2019_VISION_TARGET_FINDER_H_
2#define _Y2019_VISION_TARGET_FINDER_H_
3
Brian Silverman63236772019-03-23 22:02:44 -07004#include <memory>
5
6#include "aos/vision/blob/contour.h"
Parker Schuh2a1447c2019-02-17 00:25:29 -08007#include "aos/vision/blob/region_alloc.h"
8#include "aos/vision/blob/threshold.h"
9#include "aos/vision/blob/transpose.h"
10#include "aos/vision/debug/overlay.h"
11#include "aos/vision/math/vector.h"
12#include "y2019/vision/target_types.h"
13
Brian Silverman63236772019-03-23 22:02:44 -070014namespace ceres {
15
16class Context;
17
18} // namespace ceres
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080019namespace y2019::vision {
Parker Schuh2a1447c2019-02-17 00:25:29 -080020
Philipp Schrader790cb542023-07-05 21:06:52 -070021using aos::vision::BlobList;
22using aos::vision::ContourNode;
Parker Schuh2a1447c2019-02-17 00:25:29 -080023using aos::vision::ImageRange;
24using aos::vision::RangeImage;
Parker Schuh2a1447c2019-02-17 00:25:29 -080025using aos::vision::Vector;
26
Austin Schuh6e56faf2019-03-10 14:04:57 -070027struct Polygon {
28 ::std::vector<aos::vision::Segment<2>> segments;
29 ::std::vector<::Eigen::Vector2f> contour;
30};
31
Parker Schuh2a1447c2019-02-17 00:25:29 -080032class TargetFinder {
33 public:
34 TargetFinder();
Brian Silverman63236772019-03-23 22:02:44 -070035 ~TargetFinder();
36
Parker Schuh2a1447c2019-02-17 00:25:29 -080037 // Turn a raw image into blob range image.
38 aos::vision::RangeImage Threshold(aos::vision::ImagePtr image);
39
40 // Value against which we threshold.
Austin Schuh2851e7f2019-03-06 20:45:19 -080041 static uint8_t GetThresholdValue() { return 100; }
Parker Schuh2a1447c2019-02-17 00:25:29 -080042
Austin Schuh3b1586a2019-05-02 13:46:52 -070043 int PixelCount(BlobList *imgs);
44
Parker Schuh2a1447c2019-02-17 00:25:29 -080045 // filter out obvious or durranged blobs.
46 void PreFilter(BlobList *imgs);
47
Austin Schuhe5015972019-03-09 17:47:34 -080048 ContourNode *GetContour(const RangeImage &blob);
49 ::std::vector<::Eigen::Vector2f> UnWarpContour(ContourNode *start) const;
Ben Fredricksonf7b68522019-03-02 21:19:42 -080050
Parker Schuh2a1447c2019-02-17 00:25:29 -080051 // Turn a blob into a polgygon.
Austin Schuh6e56faf2019-03-10 14:04:57 -070052 Polygon FindPolygon(::std::vector<::Eigen::Vector2f> &&contour, bool verbose);
Parker Schuh2a1447c2019-02-17 00:25:29 -080053
54 // Turn a bloblist into components of a target.
55 std::vector<TargetComponent> FillTargetComponentList(
Austin Schuh6e56faf2019-03-10 14:04:57 -070056 const ::std::vector<Polygon> &seg_list, bool verbose);
Parker Schuh2a1447c2019-02-17 00:25:29 -080057
58 // Piece the compenents together into a target.
59 std::vector<Target> FindTargetsFromComponents(
60 const std::vector<TargetComponent> component_list, bool verbose);
61
62 // Given a target solve for the transformation of the template target.
Alex Perry24319272019-04-07 12:31:29 -070063 //
64 // This is safe to call concurrently.
Parker Schuh2a1447c2019-02-17 00:25:29 -080065 IntermediateResult ProcessTargetToResult(const Target &target, bool verbose);
66
Austin Schuhe6cfbe32019-03-10 18:05:57 -070067 // Returns true if a target is good, and false otherwise. Picks the 4 vs 8
68 // point solution depending on which one looks right.
69 bool MaybePickAndUpdateResult(IntermediateResult *result, bool verbose);
70
Parker Schuh2a1447c2019-02-17 00:25:29 -080071 std::vector<IntermediateResult> FilterResults(
Alex Perrybac3d3f2019-03-10 14:26:51 -070072 const std::vector<IntermediateResult> &results, uint64_t print_rate,
73 bool verbose);
Parker Schuh2a1447c2019-02-17 00:25:29 -080074
Alex Perry5b1e8e32019-04-07 13:25:31 -070075 bool TestExposure(const std::vector<IntermediateResult> &results,
Austin Schuh3b1586a2019-05-02 13:46:52 -070076 int pixel_count, int *desired_exposure);
Alex Perry5b1e8e32019-04-07 13:25:31 -070077
Parker Schuh2a1447c2019-02-17 00:25:29 -080078 // Get the local overlay for debug if we are doing that.
79 aos::vision::PixelLinesOverlay *GetOverlay() { return &overlay_; }
80
81 // Convert target location into meters and radians.
82 void GetAngleDist(const aos::vision::Vector<2> &target, double down_angle,
83 double *dist, double *angle);
84
85 // Return the template target in a normalized space.
86 const Target &GetTemplateTarget() { return target_template_; }
87
88 const IntrinsicParams &intrinsics() const { return intrinsics_; }
Alex Perry3bf1bee2019-02-23 20:01:15 -080089 IntrinsicParams *mutable_intrinsics() { return &intrinsics_; }
Parker Schuh2a1447c2019-02-17 00:25:29 -080090
91 private:
92 // Find a loosly connected target.
93 double DetectConnectedTarget(const RangeImage &img);
94
95 aos::vision::PixelLinesOverlay overlay_;
96
97 aos::vision::AnalysisAllocator alloc_;
98
99 // The template for the default target in the standard space.
Austin Schuh4d6e9bd2019-03-08 19:54:17 -0800100 const Target target_template_;
Parker Schuh2a1447c2019-02-17 00:25:29 -0800101
102 IntrinsicParams intrinsics_;
103
104 ExtrinsicParams default_extrinsics_;
Ben Fredricksona8c3d552019-03-03 14:14:53 -0800105
Brian Silverman63236772019-03-23 22:02:44 -0700106 const std::unique_ptr<ceres::Context> ceres_context_;
107
Ben Fredricksona8c3d552019-03-03 14:14:53 -0800108 // Counts for logging.
109 size_t frame_count_;
110 size_t valid_result_count_;
Alex Perry5b1e8e32019-04-07 13:25:31 -0700111
Austin Schuh3b1586a2019-05-02 13:46:52 -0700112 int close_bucket_ = 0;
113
Alex Perry5b1e8e32019-04-07 13:25:31 -0700114 int current_exposure_ = 0;
Parker Schuh2a1447c2019-02-17 00:25:29 -0800115};
116
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -0800117} // namespace y2019::vision
Parker Schuh2a1447c2019-02-17 00:25:29 -0800118
119#endif