2015-11-22 1 views
0

J'ai trouvé un contour d'une image. Je veux trouver le point min et le point min des contours.Récupérer la valeur de std :: vector <cv::Point> :: const_iterator

vector<Point> test = contours[0]; 
auto mmx = std::minmax_element(test.begin(), test.end(), less_by_y); 

bool less_by_y(const cv::Point& lhs, const cv::Point& rhs) 
{ 
    return lhs.y < rhs.y; 
} 

J'ai essayé ce codage et il a fonctionné avec succès. Mais en raison de ma stupidité, je ne sais pas comment récupérer les données de mmx. Quelqu'un s'il vous plaît aidez-moi?

Si je veux accéder à la valeur du point y à partir des contours, comment le faire? Je suis vraiment confus avec ces types de données.

+3

* "Mais à cause de ma stupidité" * - Non, à cause de votre manque de volonté inexplicable de lire la documentation. Sérieusement, quel est le problème avec la documentation sur http://en.cppreference.com/w/cpp/algorithm/minmax_element? –

Répondre

1

Vous pouvez voir à partir de la documentation minmax_element qu'il renvoie une paire d'itérateurs.

Étant donné:

vector<Point> pts = ... 
auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y); 

vous pouvez accéder à l'itérateur à l'élément min avec mmx.first et l'itérateur à l'élément max avec mmx.second.

Si vous souhaitez récupérer les valeurs min et max y que vous devez faire:

int min_y = mmx.first->y; 
int max_y = mmx.second->y; 

Puisque vous êtes OpenCV, vous pouvez également trouver les y valeurs à l'aide boudingRect:

Rect box = boundingRect(pts); 
std::cout << "min y: " << box.tl().y << std::endl; 
std::cout << "max y: " << box.br().y - 1 << std::endl; // Note the -1!!! 

Bien que cela soit probablement plus lent, vous n'avez pas besoin de définir la fonction de comparaison personnalisée. Cela calcule également min et max x, si nécessaire.


Voici un exemple complet:

#include <opencv2/opencv.hpp> 
#include <algorithm> 
#include <iostream> 
using namespace cv; 

bool less_by_y(const cv::Point& lhs, const cv::Point& rhs) 
{ 
    return lhs.y < rhs.y; 
} 

int main(int argc, char** argv) 
{ 
    // Some points 
    vector<Point> pts = {Point(5,5), Point(5,0), Point(3,5), Point(3,7)}; 

    // Find min and max "y" 
    auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y); 

    // Get the values 
    int min_y = mmx.first->y; 
    int max_y = mmx.second->y; 

    // Get the indices in the vector, if needed 
    int idx_min_y = std::distance(pts.begin(), mmx.first); 
    int idx_max_y = std::distance(pts.begin(), mmx.second); 

    // Show results 
    std::cout << "min y: " << min_y << " at index: " << idx_min_y << std::endl; 
    std::cout << "max y: " << max_y << " at index: " << idx_max_y << std::endl; 

    // Using OpenCV boundingRect 

    Rect box = boundingRect(pts); 
    std::cout << "min y: " << box.tl().y << std::endl; 
    std::cout << "max y: " << box.br().y - 1 << std::endl; // Note the -1!!! 

    return 0; 
} 
0

De the std::minmax() docs:

une paire constituée d'un itérateur à l'élément le plus petit que le premier élément et un itérateur pour le plus grand élément en tant que seconde. Retourne std :: make_pair (premier, premier) si la plage est vide. Si plusieurs éléments sont équivalents au plus petit élément, l'itérateur du premier élément est retourné. Si plusieurs éléments sont équivalents à l'élément le plus grand, l'itérateur du dernier élément est renvoyé.

Donc mmx.first est le minimum et mmx.second est le maximum.

+0

Vous devriez indiquer la source de votre citation: http://fr.cppreference.com/w/cpp/algorithm/minmax_element –

+0

@ChristianHackl: Oui, prévu, même eu dans mon presse-papiers, mais il s'est perdu dans le marquage ... Correction. Merci. –