Question

Étant donné un objet sur un fond blanc uni, est-ce que quelqu'un sait si OpenCV fournit des fonctionnalités permettant de détecter facilement un objet à partir d'une image capturée ?

J'essaie de localiser les points de coin/centre d'un objet (rectangle).La façon dont je le fais actuellement se fait par force brute (analyse de l'image à la recherche de l'objet) et n'est pas précise.Je me demande s'il y a des fonctionnalités sous le capot dont je ne suis pas au courant.

Modifier les détails:La taille est à peu près la même qu’une petite canette de soda.La caméra est positionnée au-dessus de l'objet, pour lui donner une sensation 2D/Rectangle.L'orientation/angle depuis la caméra est aléatoire et est calculé à partir des points d'angle.

C'est juste un fond blanc, avec l'objet dessus (noir).La qualité de la prise de vue correspond à ce que vous attendez d’une webcam Logitech.

Une fois que j’ai les points d’angle, je calcule le centre.Le point central est ensuite converti en centimètres.

J'essaie de me concentrer sur "comment" j'obtiens ces 4 virages.Vous pouvez voir ma méthode de force brute avec cette image : Image

Était-ce utile?

La solution

Il existe déjà un exemple de détection de rectangle dans OpenCV (regardez dans samples / squares.c), et c'est en fait assez simple.

Voici l'algorithme approximatif qu'ils utilisent:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

Ce n'est pas une translittération exacte de ce qu'ils font, mais cela devrait vous aider.

Autres conseils

J'espère que cela vous aidera, utilise la méthode du moment pour obtenir le centroïde d'une image en noir et blanc.

cv::Point getCentroid(cv::Mat img)
{
    cv::Point Coord;
    cv::Moments mm = cv::moments(img,false);
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}

OpenCV possède de nombreuses fonctions qui peuvent vous aider à y parvenir.Téléchargez Emgu.CV pour un C#.NET intégré à la bibliothèque si vous programmez dans ce langage.

Quelques méthodes pour obtenir ce que vous voulez :

  1. Trouvez les coins comme avant - par ex.Fonction OpenCV "CornerHarris"

  2. Seuillez l'image et calculez le centre de gravité - voir http://www.roborealm.com/help/Center%20of%20Gravity.php ...c'est la méthode que j'utiliserais.Vous pouvez même effectuer le seuillage dans la routine COG.c'est à dire.cog_x += *imagePtr < 128 ?255 :0 ;

  3. Trouvez les moments de l'image pour donner la rotation, le centre de gravité, etc. - par ex.Fonction OpenCV "Moments".(je ne l'ai pas utilisé)

  4. (modifier) ​​La bibliothèque AForge.NET possède des fonctions de détection de coins ainsi qu'un exemple de projet (MotionDetector) et des bibliothèques pour se connecter aux webcams.Je pense que ce serait la solution la plus simple, en supposant que vous utilisez Windows et .NET.

On l'appelle généralement l'analyse blob dans d'autres bibliothèques de vision par ordinateur. Je n'ai pas encore utilisé OpenCV.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top