Gestion plus logique des thresholds de détection.
This commit is contained in:
parent
3e0b1e9d68
commit
6f4747f2b3
10 changed files with 119 additions and 78 deletions
|
@ -1 +1 @@
|
|||
/home/klafyvel/Documents/supelec/2A/projet/workspace/devel/./cmake.lock 88
|
||||
/home/klafyvel/Documents/supelec/2A/projet/workspace/devel/./cmake.lock 89
|
||||
|
|
|
@ -236,17 +236,21 @@ class DEFAULT
|
|||
boost::any val;
|
||||
(*_i)->getValue(config, val);
|
||||
|
||||
if("blue"==(*_i)->name){blue = boost::any_cast<int>(val);}
|
||||
if("red"==(*_i)->name){red = boost::any_cast<int>(val);}
|
||||
if("green"==(*_i)->name){green = boost::any_cast<int>(val);}
|
||||
if("draw_targets"==(*_i)->name){draw_targets = boost::any_cast<bool>(val);}
|
||||
if("blue_min"==(*_i)->name){blue_min = boost::any_cast<int>(val);}
|
||||
if("blue_max"==(*_i)->name){blue_max = boost::any_cast<int>(val);}
|
||||
if("red_min"==(*_i)->name){red_min = boost::any_cast<int>(val);}
|
||||
if("red_max"==(*_i)->name){red_max = boost::any_cast<int>(val);}
|
||||
if("green_min"==(*_i)->name){green_min = boost::any_cast<int>(val);}
|
||||
if("green_max"==(*_i)->name){green_max = boost::any_cast<int>(val);}
|
||||
}
|
||||
}
|
||||
|
||||
int blue;
|
||||
int red;
|
||||
int green;
|
||||
bool draw_targets;
|
||||
int blue_min;
|
||||
int blue_max;
|
||||
int red_min;
|
||||
int red_max;
|
||||
int green_min;
|
||||
int green_max;
|
||||
|
||||
bool state;
|
||||
std::string name;
|
||||
|
@ -257,13 +261,17 @@ bool draw_targets;
|
|||
|
||||
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
int blue;
|
||||
int blue_min;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
int red;
|
||||
int blue_max;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
int green;
|
||||
int red_min;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
bool draw_targets;
|
||||
int red_max;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
int green_min;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
int green_max;
|
||||
//#line 228 "/opt/ros/melodic/share/dynamic_reconfigure/cmake/../templates/ConfigType.h.template"
|
||||
|
||||
bool __fromMessage__(dynamic_reconfigure::Config &msg)
|
||||
|
@ -403,45 +411,65 @@ bool draw_targets;
|
|||
{
|
||||
DetectTargetsConfig::GroupDescription<DetectTargetsConfig::DEFAULT, DetectTargetsConfig> Default("Default", "", 0, 0, true, &DetectTargetsConfig::groups);
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__min__.blue = 0;
|
||||
__min__.blue_min = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__max__.blue = 255;
|
||||
__max__.blue_min = 255;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__default__.blue = 140;
|
||||
__default__.blue_min = 140;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("blue", "int", 0, "Blue threshold", "", &DetectTargetsConfig::blue)));
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("blue_min", "int", 0, "Blue minimal threshold", "", &DetectTargetsConfig::blue_min)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("blue", "int", 0, "Blue threshold", "", &DetectTargetsConfig::blue)));
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("blue_min", "int", 0, "Blue minimal threshold", "", &DetectTargetsConfig::blue_min)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__min__.red = 0;
|
||||
__min__.blue_max = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__max__.red = 255;
|
||||
__max__.blue_max = 255;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__default__.red = 120;
|
||||
__default__.blue_max = 255;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("red", "int", 0, "Bed threshold", "", &DetectTargetsConfig::red)));
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("blue_max", "int", 0, "Blue maximal threshold", "", &DetectTargetsConfig::blue_max)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("red", "int", 0, "Bed threshold", "", &DetectTargetsConfig::red)));
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("blue_max", "int", 0, "Blue maximal threshold", "", &DetectTargetsConfig::blue_max)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__min__.green = 0;
|
||||
__min__.red_min = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__max__.green = 255;
|
||||
__max__.red_min = 255;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__default__.green = 190;
|
||||
__default__.red_min = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("green", "int", 0, "Green threshold", "", &DetectTargetsConfig::green)));
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("red_min", "int", 0, "Red minimal threshold", "", &DetectTargetsConfig::red_min)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("green", "int", 0, "Green threshold", "", &DetectTargetsConfig::green)));
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("red_min", "int", 0, "Red minimal threshold", "", &DetectTargetsConfig::red_min)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__min__.draw_targets = 0;
|
||||
__min__.red_max = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__max__.draw_targets = 1;
|
||||
__max__.red_max = 255;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__default__.draw_targets = 0;
|
||||
__default__.red_max = 120;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<bool>("draw_targets", "bool", 0, "Draw Targets", "", &DetectTargetsConfig::draw_targets)));
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("red_max", "int", 0, "Red maximal threshold", "", &DetectTargetsConfig::red_max)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<bool>("draw_targets", "bool", 0, "Draw Targets", "", &DetectTargetsConfig::draw_targets)));
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("red_max", "int", 0, "Red maximal threshold", "", &DetectTargetsConfig::red_max)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__min__.green_min = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__max__.green_min = 255;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__default__.green_min = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("green_min", "int", 0, "Green minimal threshold", "", &DetectTargetsConfig::green_min)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("green_min", "int", 0, "Green minimal threshold", "", &DetectTargetsConfig::green_min)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__min__.green_max = 0;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__max__.green_max = 255;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__default__.green_max = 190;
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
Default.abstract_parameters.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("green_max", "int", 0, "Green maximal threshold", "", &DetectTargetsConfig::green_max)));
|
||||
//#line 291 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
__param_descriptions__.push_back(DetectTargetsConfig::AbstractParamDescriptionConstPtr(new DetectTargetsConfig::ParamDescription<int>("green_max", "int", 0, "Green maximal threshold", "", &DetectTargetsConfig::green_max)));
|
||||
//#line 246 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
Default.convertParams();
|
||||
//#line 246 "/opt/ros/melodic/lib/python2.7/dist-packages/dynamic_reconfigure/parameter_generator_catkin.py"
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
\subsubsection usage Usage
|
||||
\verbatim
|
||||
<node name="detect_targets" pkg="detect_targets" type="detect_targets">
|
||||
<param name="blue" type="int" value="140" />
|
||||
<param name="red" type="int" value="120" />
|
||||
<param name="green" type="int" value="190" />
|
||||
<param name="draw_targets" type="bool" value="False" />
|
||||
<param name="blue_min" type="int" value="140" />
|
||||
<param name="blue_max" type="int" value="255" />
|
||||
<param name="red_min" type="int" value="0" />
|
||||
<param name="red_max" type="int" value="120" />
|
||||
<param name="green_min" type="int" value="0" />
|
||||
<param name="green_max" type="int" value="190" />
|
||||
</node>
|
||||
\endverbatim
|
||||
|
||||
|
|
|
@ -2,8 +2,10 @@
|
|||
|
||||
Reads and maintains the following parameters on the ROS server
|
||||
|
||||
- \b "~blue" : \b [int] Blue threshold min: 0, default: 140, max: 255
|
||||
- \b "~red" : \b [int] Bed threshold min: 0, default: 120, max: 255
|
||||
- \b "~green" : \b [int] Green threshold min: 0, default: 190, max: 255
|
||||
- \b "~draw_targets" : \b [bool] Draw Targets min: False, default: False, max: True
|
||||
- \b "~blue_min" : \b [int] Blue minimal threshold min: 0, default: 140, max: 255
|
||||
- \b "~blue_max" : \b [int] Blue maximal threshold min: 0, default: 255, max: 255
|
||||
- \b "~red_min" : \b [int] Red minimal threshold min: 0, default: 0, max: 255
|
||||
- \b "~red_max" : \b [int] Red maximal threshold min: 0, default: 120, max: 255
|
||||
- \b "~green_min" : \b [int] Green minimal threshold min: 0, default: 0, max: 255
|
||||
- \b "~green_max" : \b [int] Green maximal threshold min: 0, default: 190, max: 255
|
||||
|
||||
|
|
|
@ -3,22 +3,30 @@ param {
|
|||
group.0 {
|
||||
name=Dynamically Reconfigurable Parameters
|
||||
desc=See the [[dynamic_reconfigure]] package for details on dynamically reconfigurable parameters.
|
||||
0.name= ~blue
|
||||
0.name= ~blue_min
|
||||
0.default= 140
|
||||
0.type= int
|
||||
0.desc=Blue threshold Range: 0 to 255
|
||||
1.name= ~red
|
||||
1.default= 120
|
||||
0.desc=Blue minimal threshold Range: 0 to 255
|
||||
1.name= ~blue_max
|
||||
1.default= 255
|
||||
1.type= int
|
||||
1.desc=Bed threshold Range: 0 to 255
|
||||
2.name= ~green
|
||||
2.default= 190
|
||||
1.desc=Blue maximal threshold Range: 0 to 255
|
||||
2.name= ~red_min
|
||||
2.default= 0
|
||||
2.type= int
|
||||
2.desc=Green threshold Range: 0 to 255
|
||||
3.name= ~draw_targets
|
||||
3.default= False
|
||||
3.type= bool
|
||||
3.desc=Draw Targets
|
||||
2.desc=Red minimal threshold Range: 0 to 255
|
||||
3.name= ~red_max
|
||||
3.default= 120
|
||||
3.type= int
|
||||
3.desc=Red maximal threshold Range: 0 to 255
|
||||
4.name= ~green_min
|
||||
4.default= 0
|
||||
4.type= int
|
||||
4.desc=Green minimal threshold Range: 0 to 255
|
||||
5.name= ~green_max
|
||||
5.default= 190
|
||||
5.type= int
|
||||
5.desc=Green maximal threshold Range: 0 to 255
|
||||
}
|
||||
}
|
||||
# End of autogenerated section. You may edit below.
|
||||
|
|
|
@ -5,9 +5,11 @@ from dynamic_reconfigure.parameter_generator_catkin import *
|
|||
|
||||
gen = ParameterGenerator()
|
||||
|
||||
gen.add("blue", int_t, 0, "Blue threshold", 140, 0, 255)
|
||||
gen.add("red", int_t, 0, "Bed threshold", 120, 0, 255)
|
||||
gen.add("green", int_t, 0, "Green threshold", 190, 0, 255)
|
||||
gen.add("draw_targets", bool_t, 0, "Draw Targets", False)
|
||||
gen.add("blue_min", int_t, 0, "Blue minimal threshold", 140, 0, 255)
|
||||
gen.add("blue_max", int_t, 0, "Blue maximal threshold", 255, 0, 255)
|
||||
gen.add("red_min", int_t, 0, "Red minimal threshold", 0, 0, 255)
|
||||
gen.add("red_max", int_t, 0, "Red maximal threshold", 120, 0, 255)
|
||||
gen.add("green_min", int_t, 0, "Green minimal threshold", 0, 0, 255)
|
||||
gen.add("green_max", int_t, 0, "Green maximal threshold", 190, 0, 255)
|
||||
|
||||
exit(gen.generate(PACKAGE, "detect_targets", "DetectTargets"))
|
||||
|
|
|
@ -27,18 +27,15 @@ def normalize_coordinates(p, w, h):
|
|||
|
||||
|
||||
def find_targets(
|
||||
picture, threshold_blue=140, threshold_red=120,
|
||||
threshold_green=190, return_slices=False):
|
||||
picture, threshold_blue=(140, 255), threshold_red=(0, 120),
|
||||
threshold_green=(0, 190), return_slices=False):
|
||||
"""Find three blue targets in the given picture (RGB matrix).
|
||||
|
||||
Args:
|
||||
picture: a 2D matrix of RGB values
|
||||
threshold_blue: minimal value of the blue channel for a point to be
|
||||
considered as blue.
|
||||
threshold_red: maximal value of the red channel allowed for a
|
||||
target
|
||||
threshold_green: maximal value of the green channel allowed for a
|
||||
target
|
||||
threshold_blue: interval of allowed values for blue channel.
|
||||
threshold_red: interval of allowed values for red channel
|
||||
threshold_green: interval of allowed values for green channel
|
||||
return_slices: Boolean stating if the slices locating the targets
|
||||
should be returned.
|
||||
|
||||
|
@ -50,9 +47,12 @@ def find_targets(
|
|||
"""
|
||||
|
||||
blue_points = np.where(
|
||||
(picture[:, :, 2] > threshold_blue)
|
||||
& (picture[:, :, 0] < threshold_red)
|
||||
& (picture[:, :, 1] < threshold_green),
|
||||
(threshold_red[0] <= picture[:, :, 0])
|
||||
& (picture[:, :, 0] <= threshold_red[1])
|
||||
& (threshold_green[0] <= picture[:, :, 1])
|
||||
& (picture[:, :, 1] <= threshold_green[1])
|
||||
& (threshold_blue[0] <= picture[:, :, 2])
|
||||
& (picture[:, :, 2] <= threshold_blue[1]),
|
||||
1,
|
||||
0
|
||||
)
|
||||
|
@ -97,6 +97,6 @@ def find_targets(
|
|||
R = tuple(reversed(sides[-1]))
|
||||
|
||||
if return_slices:
|
||||
return H, L, R, [(o[0], o[1]) for o in objects]
|
||||
return H, L, R, ((o[0], o[1]) for o in objects)
|
||||
else:
|
||||
return H, L, R
|
||||
|
|
Binary file not shown.
|
@ -13,22 +13,20 @@ from detect_targets.cfg import DetectTargetsConfig
|
|||
|
||||
class Publisher:
|
||||
def __init__(self):
|
||||
self.threshold_blue = 140
|
||||
self.threshold_red = 120
|
||||
self.threshold_green = 190
|
||||
self.threshold_blue = (140, 255)
|
||||
self.threshold_red = (0, 120)
|
||||
self.threshold_green = (0, 190)
|
||||
self.centers = component_centers()
|
||||
self.pub = rospy.Publisher('targets', component_centers, queue_size=10)
|
||||
self.img_pub = rospy.Publisher('img_targets', Image, queue_size=0)
|
||||
rospy.Subscriber("/bebop/image_raw", Image, self.on_picture)
|
||||
self.bridge = CvBridge()
|
||||
self.config_srv = dynamic_reconfigure.server.Server(DetectTargetsConfig, self.on_reconf)
|
||||
self.draw_targets = False
|
||||
|
||||
def on_reconf(self, config, level):
|
||||
self.threshold_red = config['red']
|
||||
self.threshold_blue = config['blue']
|
||||
self.threshold_green = config['green']
|
||||
self.draw_targets = config['draw_targets']
|
||||
self.threshold_red = (config['red_min'], config['red_max'])
|
||||
self.threshold_blue = (config['blue_min'], config['blue_max'])
|
||||
self.threshold_green = (config['green_min'], config['green_max'])
|
||||
return config
|
||||
|
||||
def on_picture(self, msg):
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# coding: utf-8
|
||||
import matplotlib.pyplot as pl
|
||||
from matplotlib.patches import Rectangle
|
||||
|
||||
|
@ -26,7 +27,7 @@ L = normalize_coordinates(L, w, h)
|
|||
R = normalize_coordinates(R, w, h)
|
||||
ax.plot([H[0], L[0], R[0]], [H[1], L[1], R[1]], 'o', color='red')
|
||||
ax.grid()
|
||||
ax.set_title("Positions normalisées")
|
||||
ax.set_title(u"Positions normalisées")
|
||||
|
||||
|
||||
pl.show()
|
||||
|
|
Loading…
Reference in a new issue