Comment détecter le Soleil à partir de l'espace de ciel dans OpenCv?
J'ai besoin de détecter le Soleil à partir de l'espace du ciel.
Ce sont des exemples des images de l'entrée:
J'ai obtenu de tels résultats après filtrage Morphologique ( open
opération deux fois )
Voici le code de l'algorithme de ce traitement:
//Color to Gray
cvCvtColor(image, gray, CV_RGB2GRAY);
//color threshold
cvThreshold(gray,gray,150,255,CV_THRESH_BINARY);
//Morphologic open for 2 times
cvMorphologyEx( gray, dst, NULL, CV_SHAPE_RECT, CV_MOP_OPEN, 2);
N'est-il pas trop lourd traitement pour une telle tâche simple? Et comment trouver le centre du Soleil? Si je trouve des points blancs, que je vais trouver des points blancs de la grande Terre ( en haut à gauche sur la première image par exemple )
Merci de me conseiller s'il vous plaît mes autres mesures pour détecter le Soleil.
Mise à JOUR 1:
Essayer algorithme de prise en centroid
par la formule : {x,y} = {M10/M00, M01/M00}
CvMoments moments;
cvMoments(dst, &moments, 1);
double m00, m10, m01;
m00 = cvGetSpatialMoment(&moments, 0,0);
m10 = cvGetSpatialMoment(&moments, 1,0);
m01 = cvGetSpatialMoment(&moments, 0,1);
//calculating centroid
float centroid_x = m10/m00;
float centroid_y = m01/m00;
cvCircle( image,
cvPoint(cvRound(centroid_x), cvRound(centroid_y)),
50, CV_RGB(125,125,0), 4, 8,0);
Et où la Terre est dans la photo, j'ai obtenu un résultat:
Donc, le centre de gravité est sur la Terre. 🙁
Mise à JOUR 2:
Essayer cvHoughCircles
:
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* circles = cvHoughCircles(dst, storage, CV_HOUGH_GRADIENT, 12,
dst->width/2, 255, 100, 0, 35);
if ( circles->total > 0 ) {
//getting first found circle
float* circle = (float*)cvGetSeqElem( circles, 0 );
//Drawing:
//green center dot
cvCircle( image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
3, CV_RGB(0,255,0), -1, 8, 0 );
//wrapping red circle
cvCircle( image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
cvRound(circle[2]), CV_RGB(255,0,0), 3, 8, 0 );
}
Premier exemple: le bingo, mais le deuxième n' ;(
J'ai essayé différentes configuration de cvHoughCircles()
- n'arrivais pas à trouver de configuration pour s'adapter à tous mon exemple de photo.
UPDATE3:
matchTemplate
approche a fonctionné pour moi ( réponse de mevatron
). Il a travaillé avec un grand nombre de tests.
OriginalL'auteur Larry Cinnabar | 2011-11-21
Vous devez vous connecter pour publier un commentaire.
À faire l'essai d'un simple
matchTemplate
approche. J'ai utilisé ce modèle d'image:Et, il a détecté la 3 sur 3 des images du soleil, j'ai essayé:
Cela devrait fonctionner en raison du fait que les cercles (dans votre cas le soleil) sont invariant par rotation, et puisque vous êtes si loin du soleil, il doit être à peu près invariant d'échelle. Ainsi, le modèle de l'appariement fonctionne très bien ici.
Enfin, voici le code que j'ai utilisé pour ce faire:
Espérons que vous trouverez très utile!
Les bons points, en effet 🙂 Mais, depuis que je suis en supposant que le vaisseau spatial est dans notre système solaire, je crois qu'il est sûr de dire un seul Soleil va se montrer 😀
Je suppose que ce serait un échec si une partie quelconque de la PALETTE (le pilote de l'interface utilisateur) obtient sur le dessus du soleil. À moins que le modèle d'appariement donne un score sur comment bon le match est, de cette façon, vous pourriez seuil haut de la liste et il serait sans doute travailler avec certains des obstacles.
Si je pouvais upvote cette fois, je voudrais
OriginalL'auteur mevatron
Couleur Approche De Segmentation
Faire une couleur de segmentation sur les images pour identifier les objets sur le fond noir. Vous pouvez identifier le soleil en fonction de sa zone (compte tenu de ce qui l'identifie, resp. ne varie grandement à travers les images).
Une approche plus sophistiquée pourrait calculer l'image des moments, par exemple, hu moments des objets. Voir cette page pour ces fonctions.
Utiliser un algorithme de classification de votre choix pour faire le classement des objets trouvés. L'approche plus simple est de spécifier manuellement les seuils, resp. les plages de valeurs qui fonctionnent pour toutes les(plus) de votre objet/image combinaisons.
Vous pouvez calculer la position réelle de la crue des moments, comme de la circulaire du soleil, la position est égale à la centre de masse
Bord De La Carte D'Approche
Une autre option serait un cercle de hough transformation du bord de la carte, ce sera je l'espère le retour de certains candidats cercles (par la position et le rayon). Vous pouvez sélectionner le soleil-cercle en fonction du rayon vous attendre (si vous êtes chanceux, il y a au plus un).
Centroid
point. Mais si la Terre prend un peu de l'écran (comme dans l'image #1 en haut à gauche), que cette partie est "plus lourd" que le Soleil et le Centre de gravité est déplacé. J'ai essayé avec CircleHough, et il ne fonctionne pas pour toutes mes photos par exemple...J'ai mis à jour mes questions - exemples ont été ajoutés
OriginalL'auteur moooeeeep
Une simple addition à votre code est de filtrer les objets en fonction de leur taille. Si vous avez toujours s'attendre à de la terre à être beaucoup plus grosse que le soleil, ou le soleil à peu près à la même zone à chaque image, vous pouvez la filtrer par zone.
Essayer Blob détecteur de pour cette tâche.
Et notez qu'il peut être bon d'appliquer un morphologiques de l'ouverture/fermeture au lieu de s'épuisent ou se dilater, de sorte que votre soleil sera presque la même zone avant et après traitement.
Prendre la dernière OpenCV à partir de sourceforge sourceforge.net/projects/opencvlibrary Et à l'utilisation c'est aussi simple que l'opérateur d'incrémentation 🙂 C'est déjà compilé. Et.. ne vous ajouter en utilisant un espace de cv? Comment n'avez-vous pas de la goutte détecteur?
OriginalL'auteur Sam