}
-void PiReferential::draw_edge_and_scale(RGBImage *image,
- int registration_mode, Rectangle *window,
- int _tag, int _edge_scale) {
- const int ref_radius = 10;
- int r, g, b;
- int edges = 0;
-
- switch(registration_mode) {
-
- case PiReferential::RM_HEAD:
- r = 0; g = 255; b = 0;
- break;
-
- case PiReferential::RM_HEAD_NO_POLARITY:
- r = 128; g = 255; b = 128;
- break;
-
- case PiReferential::RM_BELLY:
- r = 64; g = 0; b = 255;
- break;
-
- case PiReferential::RM_BELLY_NO_POLARITY:
- r = 192; g = 128; b = 255;
- break;
-
- case PiReferential::RM_HEAD_BELLY_EDGES:
- edges = 1;
- case PiReferential::RM_HEAD_BELLY:
- r = 255; g = 0; b = 0;
- break;
-
- default:
- cerr << "INCONSISTENCY" << endl;
- abort();
- }
-
- scalar_t xc = (window->xmin + window->xmax)/2;
- scalar_t yc = (window->ymin + window->ymax)/2;
- int radius = ref_radius * (1 << _edge_scale);
-
- image->draw_ellipse(1, r, g, b, xc, yc, radius, radius, 0);
-
- if(_tag >= RichImage::first_edge_tag && _tag < RichImage::first_edge_tag + RichImage::nb_edge_tags) {
-
- scalar_t dx, dy;
-
- switch(_tag - RichImage::first_edge_tag) {
- case 0:
- dx = 0; dy = -1;
- break;
-
- case 1:
- dx = 1; dy = -1;
- break;
-
- case 2:
- dx = 1; dy = 0;
- break;
-
- case 3:
- dx = 1; dy = 1;
- break;
-
- case 4:
- dx = 0; dy = 1;
- break;
-
- case 5:
- dx = -1; dy = 1;
- break;
-
- case 6:
- dx = -1; dy = 0;
- break;
-
- case 7:
- dx = -1; dy = -1;
- break;
-
- default:
- abort();
- }
-
- scalar_t l = sqrt(dx * dx + dy * dy);
-
- if(edges) {
- int delta = 3;
- image->draw_ellipse(1, r, g, b, xc, yc, radius + delta, radius + delta, 0);
- }
-
- for(scalar_t u = 0; u <= radius; u += 0.1) {
- scalar_t s = sqrt(radius * radius - (u * u * l * l))/l;
- image->draw_line(2, r, g, b,
- int(xc + u * dx - s * dy), int(yc + u * dy + s * dx),
- int(xc + u * dx + s * dy), int(yc + u * dy - s * dx));
- }
-
- }
-
- else if(_tag == RichImage::variance_tag) {
- image->draw_ellipse(1, r, g, b, xc, yc, 8, 8, 0);
- }
-}
-
PiReferential::PiReferential(PoseCell *cell) {
scalar_t head_radius = sqrt(scalar_t(cell->_head_radius.min * cell->_head_radius.max));
// Body location
+ // Useless code, but necessary to keep the exact same results with
+ // g++ 4.1 and -O3 options on reference experiments.
+
_body_xc = cell->_belly_xc.middle() * discrete_scale_ratio;
_body_yc = cell->_belly_yc.middle() * discrete_scale_ratio;
// Frames
if(_body_xc >= _head_xc) {
-// if(_belly_xc >= _head_xc) {
+ // if(_belly_xc >= _head_xc) {
_horizontal_polarity = 1;
} else {
_horizontal_polarity = -1;
// with g++ gives the same results as some reference
// experiments. Sorry for that.
scalar_t _body_xc, _body_yc;
-// scalar_t _body_radius_1, _body_radius_2;
scalar_t _body_tilt;
// The belly frame is defined by the belly location and head scale
int registration_mode, Rectangle *window,
int filled);
- void draw_edge_and_scale(RGBImage *image,
- int registration_mode, Rectangle *window,
- int _tag, int _edge_scale);
-
static void print_registration_mode(ostream *out, int registration_mode);
};