Skip to content

Commit abc051c

Browse files
committed
additionally filter contours by their size
this allows filtering out some false-positives which were so far incorrectly recognized as bananas.
1 parent f85c8b7 commit abc051c

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

include/banana-lib/lib.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ namespace banana {
118118
/// Maximum score of `cv::matchShapes` which we still accept as a banana.
119119
float const match_max_score{0.6f};
120120

121+
/// Minimum area value of a banana (in px^2).
122+
float const min_area{1e5f};
123+
124+
/// Maximum area value of a banana (in px^2).
125+
float const max_area{1e7f};
126+
121127
/// How long (in pixels) is a meter? This is the extrinsic calibration needed to calculate sizes.
122128
double const pixels_per_meter;
123129

resources/test-images/banana-30.jpg

-11.9 MB
Binary file not shown.

src/lib.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,19 @@ namespace banana {
106106
}
107107

108108
auto Analyzer::IsBananaContour(Contour const& contour) const -> bool {
109-
return cv::matchShapes(contour, this->reference_contour_, cv::CONTOURS_MATCH_I1, 0.0) > this->settings_.match_max_score;
109+
if (cv::matchShapes(contour, this->reference_contour_, cv::CONTOURS_MATCH_I1, 0.0) > this->settings_.match_max_score) {
110+
return false;
111+
}
112+
auto const area = cv::contourArea(contour);
113+
return settings_.min_area < area && area < settings_.max_area;
110114
}
111115

112116
auto Analyzer::FindBananaContours(cv::Mat const& image) const -> Contours {
113117
auto filtered_image = ColorFilter(image, settings_.filter_lower_threshold_color, settings_.filter_upper_threshold_color);
114118
SHOW_DEBUG_IMAGE(filtered_image, "color filtered image");
115119

116120
// Removing noise
117-
auto const kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
121+
auto const kernel = cv::getStructuringElement(cv::MORPH_RECT, {5, 5});
118122
cv::morphologyEx(filtered_image, filtered_image, cv::MORPH_OPEN, kernel);
119123
SHOW_DEBUG_IMAGE(filtered_image, "morph");
120124

@@ -126,7 +130,7 @@ namespace banana {
126130
cv::findContours(filtered_image, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
127131

128132
std::erase_if(contours, [this](auto const& contour) -> auto {
129-
return this->IsBananaContour(contour);
133+
return !this->IsBananaContour(contour);
130134
});
131135

132136
return contours;

0 commit comments

Comments
 (0)