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
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.
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;
}
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:
-
trouver les coins comme avant-p.ex. "CornerHarris" fonction OpenCV
-
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;
-
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)
-
(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.
Il est généralement appelé l'analyse blob dans d'autres bibliothèques. Je n'ai pas utilisé opencv encore.