void GridAdaptedFeatureDetector::detectImpl(const Mat& image, const Mat& mask, vector<KeyPoint> &keypoints) const { keypoints.clear(); keypoints.reserve(maxTotalKeypoints); int maxPerCell = maxTotalKeypoints / (gridRows * gridCols); for (int i = 0; i < gridRows; ++i) { Range row_range((i * image.rows) / gridRows, ((i + 1)*image.rows) / gridRows); for (int j = 0; j < gridCols; ++j) { Range col_range((j * image.cols) / gridCols, ((j + 1)*image.cols) / gridCols); Mat sub_image = image(row_range, col_range); Mat sub_mask; if (!mask.empty()) { sub_mask = mask(row_range, col_range); } vector<KeyPoint> sub_keypoints; detector->detect(sub_image, sub_keypoints, sub_mask); keepStrongest(maxPerCell, sub_keypoints); for (std::vector<cv::KeyPoint>::iterator it = sub_keypoints.begin(), end = sub_keypoints.end(); it != end; ++it) { it->pt.x += col_range.start; it->pt.y += row_range.start; } keypoints.insert(keypoints.end(), sub_keypoints.begin(), sub_keypoints.end()); } } }
worksheet::const_iterator worksheet::cbegin() const { auto dimensions = calculate_dimension(); cell_reference top_right(dimensions.get_bottom_right().get_column_index(), dimensions.get_top_left().get_row()); range_reference row_range(dimensions.get_top_left(), top_right); return const_iterator(*this, row_range, major_order::row); }