-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgolf_ball_pose.cpp
More file actions
89 lines (68 loc) · 3.2 KB
/
Copy pathgolf_ball_pose.cpp
File metadata and controls
89 lines (68 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "golf_ball_pose.hpp"
#include "image_processing.hpp"
std::vector<GolfBallPose> estimateGolfBallPoses(
const cv::Mat &leftImage,
const cv::Mat &rightImage,
const StereoSystem &stereoSystem,
const GolfBallPoseEstimationParameters ¶ms,
bool debug
){
const float MAX_Y_DIFF = 20;
const int BLUR_SIZE = 3;
const float NORMALIZED_TOP_PERCENT = 0.1;
const int THRESHOLD_BIAS = -20;
const int MIN_ELLIPSE_AREA = M_PI * ((params.minBallSize_px/2) * (params.minBallSize_px/2));
const int MAX_ELLIPSE_AREA = M_PI * ((params.maxBallSize_px/2) * (params.maxBallSize_px/2));
cv::Mat leftDebug;
cv::Mat rightDebug;
if(debug){
leftDebug = leftImage.clone();
rightDebug = rightImage.clone();
}
std::vector<cv::Point2f> leftBlobs = detectBlobs(leftImage, params.minBallSize_px, params.maxBallSize_px, true);
std::vector<cv::Point2f> rightBlobs = detectBlobs(rightImage, params.minBallSize_px, params.maxBallSize_px, true);
matchStereoPoints(leftBlobs, rightBlobs, params.minBallDepth, params.maxBallDepth, stereoSystem, MAX_Y_DIFF);
for(std::size_t i = 0; i < leftBlobs.size(); i++){
cv::Point2f leftBlob = leftBlobs[i];
cv::Point2f rightBlob = rightBlobs[i];
cv::Mat leftCropped = cropSquarePatch(leftImage, leftBlob, params.maxBallSize_px);
cv::Mat rightCropped = cropSquarePatch(rightImage, rightBlob, params.maxBallSize_px);
PreprocessStages ppsLeft = generatePreprocessedStages(leftCropped, BLUR_SIZE, NORMALIZED_TOP_PERCENT, THRESHOLD_BIAS);
PreprocessStages ppsRight = generatePreprocessedStages(rightCropped, BLUR_SIZE, NORMALIZED_TOP_PERCENT, THRESHOLD_BIAS);
cv::RotatedRect ellipesLeft = findBlobEllipse(ppsLeft.thresholded, MIN_ELLIPSE_AREA, MAX_ELLIPSE_AREA);
cv::RotatedRect ellipesRight = findBlobEllipse(ppsRight.thresholded, MIN_ELLIPSE_AREA, MAX_ELLIPSE_AREA);
ellipesLeft.center += leftBlob;
ellipesRight.center += rightBlob;
cv::Point3f golfBallPosition = triangulatePoint(ellipesLeft.center, ellipesRight.center, stereoSystem);
std::vector<cv::Point2f> leftDotLocations = detectBlobs(
ppsLeft.normalized,
params.minDotSize_px,
params.maxBallSize_px,
false, 0
);
for(cv::Point2f &dot: leftDotLocations){
dot += leftBlob - cv::Point2f(params.maxBallSize_px/2, params.maxBallSize_px/2);
}
std::vector<cv::Point2f> rightDotLocations = detectBlobs(
ppsRight.normalized,
params.minDotSize_px,
params.maxBallSize_px,
false, 0
);
for(cv::Point2f &dot: rightDotLocations){
dot += rightBlob - cv::Point2f(params.maxBallSize_px/2, params.maxBallSize_px/2);
}
if(debug){
drawPoints(leftDebug, leftDotLocations);
drawPoints(rightDebug, rightDotLocations);
drawEllipseDetection(leftDebug, ellipesLeft);
drawEllipseDetection(rightDebug, ellipesRight);
}
}
if(debug){
cv::imshow("left image", leftDebug);
cv::imshow("right image", rightDebug);
cv::waitKey(0);
}
return {};
}