La détection des LED de statut de l'objet à partir d'une Image
Ma question est similaire à OpenCV: Détecter des lumières clignotantes dans un flux vidéo
openCV détecter des lumières clignotantes
Je veux détecter LED de statut on/off de toute image qui ont CONDUIT objet. Objet LED peuvent être de toute taille ( mais surtout cercle ). Il est important d'obtenir l'emplacement de tous les témoins de cette image même si elle peut être allumé ou ÉTEINT. Tout d'abord, je voudrais obtenir le statut et la position de la Led qui sont SUR seulement. Maintenant source de l'image est statique, pour mon travail, mais il doit être à partir de la vidéo de tout produit ayant Voyants lumineux. Donc, il n'y a aucune chance d'avoir le modèle de l'image afin de la soustraire à l'arrière-plan.
J'ai essayé à l'aide d'OpenCV (nouveaux OpenCV) avec seuil, des Contours et des Cercles de méthodes mais ne trouve pas réussie. Merci de partager si tout code source ou de la solution. La solution peut être n'importe quoi, non seulement à l'aide d'OpenCV, qui devrait donner le résultat pour moi. Il serait grandement apprécié.
La différence de deux autres question, c'est que je veux obtenir le numéro de la Led dans l'image qu'il peut être allumé ou ÉTEINT et le statut de tous les Voyants. Je sais que c'est très complexe. Tout d'abord j'ai essayé de détecter les Voyants lumineux de l'image. J'ai mis en place le code qui j'ai partagé ci-dessous. J'ai eu différentes implémentations mais code ci-dessous est en mesure de me montrer les Voyants lumineux juste en dessinant les contours, mais le nombre de contours sont plus que les Voyants lumineux. Je ne suis donc pas en mesure d'obtenir le nombre total de Voyants lumineux atleast. Merci de me suggérer vos entrées.
int main(int argc, char* argv[])
{
IplImage* newImg = NULL;
IplImage* grayImg = NULL;
IplImage* contourImg = NULL;
float minAreaOfInterest = 180.0;
float maxAreaOfInterest = 220.0;
//parameters for the contour detection
CvMemStorage * storage = cvCreateMemStorage(0);
CvSeq * contours = 0;
int mode = CV_RETR_EXTERNAL;
mode = CV_RETR_CCOMP; //detect both outside and inside contour
cvNamedWindow("src", 1);
cvNamedWindow("Threshhold",1);
//load original image
newImg = cvLoadImage(argv[1], 1);
IplImage* imgHSV = cvCreateImage(cvGetSize(newImg), 8, 3);
cvCvtColor(newImg, imgHSV, CV_BGR2HSV);
cvNamedWindow("HSV",1);
cvShowImage( "HSV", imgHSV );
IplImage* imgThreshed = cvCreateImage(cvGetSize(newImg), 8, 1);
cvInRangeS(newImg, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);
cvShowImage( "src", newImg );
cvShowImage( "Threshhold", imgThreshed );
//make a copy of the original image to draw the detected contour
contourImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 3);
contourImg=cvCloneImage( newImg );
cvNamedWindow("Contour",1);
//find the contour
cvFindContours(imgThreshed, storage, &contours, sizeof(CvContour), mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
int i = 0;
for (; contours != 0; contours = contours->h_next)
{
i++;
//ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); //randomly coloring different contours
cvDrawContours(contourImg, contours, CV_RGB(0, 255, 0), CV_RGB(255, 0, 0), 2, 2, 8, cvPoint(0,0));
}
printf("Total Contours:%d\n", i);
cvShowImage( "Contour", contourImg );
cvWaitKey(0);
cvDestroyWindow( "src" ); cvDestroyWindow( "Threshhold" );
cvDestroyWindow( "HSV" );
cvDestroyWindow( "Contour" );
cvReleaseImage( &newImg ); cvReleaseImage( &imgThreshed );
cvReleaseImage( &imgHSV );
cvReleaseImage( &contourImg );
}
J'ai édité ma question et ajouté le code.
Pouvez-vous le mettre ici ce type d'images que vous travaillez avec? Plusieurs exemples.
Comme je suis un nouvel utilisateur, je ne suis pas autorisé à télécharger des images. Veuillez trouver le lien ci-dessous pour une image de l'échantillon. lien
Vous êtes à la recherche pour les led d'une seule couleur? Connaissez-vous cette couleur avant de commencer l'algorithme? Avez-vous un lot d'images à partir de la même place (ou de votre appareil au fil du temps ? )?
OriginalL'auteur jkstar | 2012-05-22
Vous devez vous connecter pour publier un commentaire.
Je dispose de peu de temps la nuit d'hier, voici une (très) simple et une solution partielle qui fonctionne très bien pour moi.
J'ai créé un dépôt git que vous pouvez directement clone :
git://github.com/jlengrand/image_processing.git
et de les exécuter à l'aide de Python
Vous pouvez voir le code ici
Ma méthode :
Le code ne prend qu'une image en considération à ce stade, mais vous pouvez l'améliorer avec une boucle de prendre un lot d'images (je donne déjà quelques images par exemple dans mon repo.)
Il vous suffit de jouer un peu avec le centre trouvé pour les Voyants, car ils peuvent ne pas être un pixel précis à partir d'une image à l'autre (centre pourrait être légèrement décalé).
Pour obtenir l'algorithme plus robuste (savoir si il y a une LED ou pas, trouver une automatique et pas codé en dur la valeur de marge), vous pouvez jouer un peu avec le histogramme (placé dans extract_bright).
J'ai déjà créé la fonction pour cela il vous faut juste l'améliorer un peu.
De plus amples informations sur les données d'entrée :
Opencv n'accepte que les fichiers avi pour l'instant, donc vous devez le convertir en un fichier mp4 en avi (non compressé dans mon cas). J'ai utilisé cette, cela a parfaitement fonctionné.
Pour une raison quelconque, le queryframe fonction causé des fuites de mémoire sur mon ordinateur. C'est pourquoi j'ai créé le grab_images fonctions, qui prend le fichier avi en entrée et crée un lot d'images jpg que vous pouvez utiliser plus facile.
Voici le résultat pour une image :
Image d'entrée :
Image binaire :
Résultat Final :
Espère que cette aide. . .
EDIT :
Votre problème est un peu plus complexe si vous souhaitez utiliser cette image. La méthode que j'ai posté pourrait toujours être utilisé, mais doit être un peu complexified.
Vous voulez détecter les leds qui affichent une "information" (statut, de la bande passante . . . ) et jetez la partie design.
Je vois trois solutions simples à ce :
Espère que cela apporte un peu plus de nourriture pour les pensées
Salut, Content que cela a aidé. Voir mon edit
Merci encore pour votre réponse. Première et de la deuxième solution n'est pas applicable dans mon cas. Dans le troisième cas, pouvez-vous expliquer plus en détails. Je veux dire, je ne comprends pas certaines conditions. Par exemple, quelle est l'étape d'apprentissage? Il serait génial si vous pouviez agrandir vos pensées.
Eh bien, cela veut dire que si vous n'avez pas de connaissances préalables, la seule solution est au fond une manière intelligente de "deviner" où chercher. J'aurais tendance à enregistrer des images au fil du temps, et la recherche d'objets qui clignotent. Je voudrais supprimer le encore (dans vos photos, la partie bleue) theuy ne bougent pas avec le temps, et ont tous la même couleur
Merci. Vous avez mentionné que nous avons besoin de jouer avec l'histogramme de faire de l'algorithme robuste pour savoir si la DEL est allumée ou pas. Pouvez-vous nous expliquer comment elle pourrait être utilisée ici.
OriginalL'auteur jlengrand