Détecter des cartes et des rectangles sur la table blanche avec OpenCV en Python?
J'ai essayé de comprendre comment aller sur la détection des cartes sur une table, puis extraire les images de tout les cartes. Après avoir fait un peu de lecture, j'ai pensé qu'il est préférable d'utiliser des cv.Habile à bord de détecter car les cartes seront les seules choses sur le tableau blanc. Ensuite, obtenir la carte de l'image à partir d'une ouverture rectangulaire de l'image selon les bords détectés.
Mais je ne suis pas sûr de la façon d'obtenir de l'information de pointe(coordonnées) de l'Habile info. Je peux obtenir le Savant de l'information et de la stocker dans un IplImage, mais je ne suis pas sûr de la façon d'obtenir les informations nécessaires pour créer un rectangle autour de la carte et la découpe de l'image.
import cv
cam = cv.CaptureFromCAM(0)
while True:
capture = cv.QueryFrame(cam)
#apply mask to block out white background
grey = cv.CreateImage(cv.GetSize(capture), 8, 1)
masked_image = cv.CreateImage(cv.GetSize(capture), 8, 3)
cv.CvtColor(capture, grey, cv.CV_BGR2GRAY)
cv.Threshold(grey, grey, 100, 255, cv.CV_THRESH_BINARY)
cv.Zero(masked_image)
cv.Not(grey, grey)
cv.Copy(capture, masked_image, grey)
#detect corners
corners = cv.CreateImage(cv.GetSize(masked_image), 8, 1)
#cv.CornerHarris(masked_image, corners, ?)
cv.Canny(grey, corners, 900, 890)
cv.ShowImage('b_window', corners)
cv.WaitKey(2)
- Double Possible de stackoverflow.com/questions/1817442/...
- J'ai particulièrement besoin de connaître les coordonnées x, y, et la hauteur, de la largeur de la carte détectée à partir de l'image.
- double possible de OpenCV C++/Obj-C: la Détection d'une feuille de papier / de Détection Carrée
- C'est une langue différente, et j'ai précisément dit j'ai besoin des coordonnées x, y de bords/coins.
Vous devez vous connecter pour publier un commentaire.
Il y a un bon billet de blog à ce sujet:
Le code est disponible sur gihub: https://github.com/arnabdotorg/Playing-Card-Recognition
En supposant que les bords de la carte/rectangle sont au premier plan après le Savant opération, vous pouvez trouver des contours externes à l'aide de findContours avec CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE pour récupérer le contour rectangulaire codé avec 4 points. Notez que la distorsion de perspective n'a pas d'importance car il va encoder les 4 points extérieurs, indépendamment de la perspective.
Tester les contours (convexe avec des angles de plage). karlphillip a fait un bon exemple de ceci:
https://stackoverflow.com/a/8863060/3475075
Si il a détecté d'autres contours de l'image, de récupérer le plus grand rectangle (contour avec la plus grande région de) à l'aide de contourArea()
Si vous avez besoin de savoir à quel point est en haut à gauche, à droite, etc un moyen simple de déterminer qui est le calcul de la somme et la différence des valeurs x et y:
Vous devriez poster plus de détails pour aider à réduire la conseils. Par exemple, est l'image de la surcharge, ou aura-t-il projectif de distorsion? Est-il uniforme de l'éclairage? Combien de cartes sont là? Faire des cartes se chevauchent? En général, un détecteur de bord est juste une petite première étape dans la détection d'objet.
Si votre problème est très limité, cependant, vous pourriez être en mesure de seuil, filtre de composantes connexes, l'utilisation de la transformation de Hough ou de l'utilisation des informations de couleur.