void inline reduce_min( const std::vector<cv::Mat_<float> >& scores,
    const std::vector<cv::Mat_<int> > d_xs,
    const std::vector<cv::Mat_<int> > d_ys,
    const std::vector<float>& weights,
    cv::Mat& score,  cv::Mat_<int>& d_x, cv::Mat_<int>& d_y) {
  score = cv::Mat::zeros(scores[0].size(), cv::DataType<float>::type);
  d_x   = cv::Mat::zeros(scores[0].size(), cv::DataType<int>::type);
  d_y   = cv::Mat::zeros(scores[0].size(), cv::DataType<int>::type);
  for(int x = 0; x < score.cols; ++x) {
    for(int y = 0; y < score.rows; ++y) {
      const cv::Point p(x,y);
      int min_index = get_min_index(scores, p, weights);
      score.at<float>(p) = scores[min_index].at<float>(p) + weights[min_index];
      d_x.at<int>(p) = d_xs[min_index].at<int>(p);
      d_y.at<int>(p) = d_ys[min_index].at<int>(p);
    }
  }
}
void selection_sort(int * array, int size) {
  for ( int i = 0 ; i < size ; i++ ) {
    swap_int(&array[i], &array[get_min_index(array+i, size-i) + i]);
  }
}