OpenCV Détection D'Objets-Point Central

avec un objet sur fond blanc, est-ce que quelqu'un sait si OpenCV fournit une fonctionnalité permettant de détecter facilement un objet à partir d'un cadre capturé?

j'essaie de localiser les points de coin/centre d'un objet (rectangle). La façon dont je le fais actuellement, est par la force brute (balayage de l'image pour l'objet) et 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 : De la même taille 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/l'angle de la caméra est aléatoire, qui est calculé à partir des points d'angle.

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

une fois que j'ai les points d'angle, Je calcule le centre. Centre le point est ensuite converti en centimètres.

c'est peaufiner juste "comment" j'obtiens ces 4 coins est ce que j'essaye de se concentrer sur. Vous pouvez voir ma méthode de la force brute avec cette image: Image

33
demandé sur Adaline Valentina Simonian 2008-11-11 01:32:04

4 réponses

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

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}

Pas une translittération exacte de ce qu'ils font, mais il devrait vous aider.

26
répondu Ismael C 2008-11-26 18:30:23

Espère que cette aide, utilise l'instant méthode pour obtenir le centre de gravité 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;
}
7
répondu Rod Dockter 2012-09-26 19:25:17

OpenCV a un tas de fonctions qui peuvent vous aider à atteindre cet objectif. Télécharger Emgu.CV pour un C#.NET enveloppé dans la bibliothèque Si vous programmez dans cette langue.

voici Quelques méthodes pour obtenir ce que vous voulez:

  1. trouver les coins comme avant-p.ex. "CornerHarris" fonction OpenCV

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

  3. trouver les moments de l'image pour donner la rotation, le centre de gravité etc - par exemple" Moments " fonction OpenCV. (Je n'ai pas utilisé cette)

  4. (edit) The AForge.NET la bibliothèque a des fonctions de détection de coin ainsi qu'un exemple de projet (MotionDetector) et des bibliothèques pour se connecter aux webcams. Je pense que ce serait la façon la plus facile d'y aller, en supposant que vous utilisez Windows et .NET.

4
répondu geometrikal 2008-11-13 00:49:44

Il est généralement appelé l'analyse blob dans d'autres bibliothèques. Je n'ai pas utilisé opencv encore.

0
répondu kenny 2008-11-10 22:56:51