|
GECKO 1.0
Human-computer interface based on hand gesture recognition
|
Finds the maximum inscribed circle of the hand contour, which describes the hand palm. {
//-- Parameters describing this hand palm procedure:
const int x_ratio = 3; //-- Section of the bounding box used for finding center (along X)
const int y_ratio = 3; //-- Section of the bounding box used for finding center (along Y)
const int step_contour = 1; //-- Test each 'step' points of the contour for easier calculations
const int step_points_inside = 1;//-- Test each 'step' points inside the contour
//-- Extract points to use
std::vector< cv::Point > points_to_use;
if ( step_contour == 1)
{
points_to_use = _hand_contour[0];
}
else
{
for (int i = 0; i < (int) ( _hand_contour[0].size() / (float) step_contour); i++)
points_to_use.push_back( _hand_contour[0][i]);
}
//-- Find initial and ending points of the area to look for
std::pair<int,int> x_limits, y_limits;
x_limits.first = _hand_bounding_box.x + _hand_bounding_box.width / x_ratio;
x_limits.second = _hand_bounding_box.x + (int) ( _hand_bounding_box.width * (1 - 1 /(float) x_ratio));
y_limits.first = _hand_bounding_box.y + _hand_bounding_box.height / y_ratio;
y_limits.second = _hand_bounding_box.y + (int) ( _hand_bounding_box.height * (1 - 1 /(float) y_ratio));
//-- Look for center and radius
std::pair<int, int> best_center = std::pair<int, int>( x_limits.first, y_limits.first);
double best_distance = -1;
/*
std::cout << "(" << x_limits.first << ", " << x_limits.second << ")" << std::endl;
std::cout << "(" << y_limits.first << ", " << y_limits.second << ")" << std::endl;
*/
for (int j = y_limits.first; j < y_limits.second; j += step_points_inside )
for (int i = x_limits.first; i < x_limits.second; i += step_points_inside )
{
double current_distance = cv::pointPolygonTest( points_to_use, cv::Point(i, j), true );
if (current_distance > 0 && current_distance > best_distance)
{
best_distance = current_distance;
best_center.first = i;
best_center.second = j;
}
}
//-- Once best distance is found, we get the center and calculate the actual radius (only if something is found)
if ( best_distance > -1 )
{
_max_circle_incribed_center = cv::Point( best_center.first, best_center.second );
_max_circle_inscribed_radius = best_distance;
// std::cout << "[Debug] Inscribed circle: " << _max_circle_incribed_center << " -> r =" << _max_circle_inscribed_radius << std::endl;
}
else
{
std::cerr << "[Error]: Inscribed circle could not be found!" << std::endl;
}
}
|
1.7.4