Aller au contenu

DrThrax

Membre
  • Compteur de contenus

    758
  • Inscription

  • Dernière visite

À propos de DrThrax

  • Date de naissance 01/30/1986

A propos

  • Résidence
    Terre
  • Intérêts
    Informatique, Astronomie
  • Occupation
    Chimiste
  • Matériel
    Lunette achromatique 60/700
    Newton 130/650 P
    Lunette achromatique 100/500
    Monture Altaz GOTO SW
    Renvoi coudé CaK Lunt
    Occulaire 25mm, 10mm SW
    Barlow 2x SW

Visiteurs récents du profil

1201 visualisations du profil

DrThrax's Achievements

  1. Bonjour, Je ne sais pas si ce sujet a déjà été abordé et s’il a déjà été, un modérateur peu sans regret supprimer ce post. Le but de ce petit tutoriel est de vous faire programmer un tout petit peu, sans prétention, pour se faire plaisir, peut être développer l’idée du siècle ou encore passer le temps pendant le confinement en essayant des choses nouvelles ! N’ayez pas peur, le tuto ne compte pas vous faire un cours complet d’algorithme, de Java, de traitement d’image, c’est même une programmation assez grossière mais qui permet d’aborder tranquillou le sujet. Bon assez blablaté, on y va ! L'idée: Arriver à programmer un plugin de le très connu Firecapture. Comment: Avec des logiciels gratuits, un peu de patience et de curiosité. Prérequis: Aucun! Mais si vous si vous comprenez l'anglais, vous pouvez suivre l'excellent tutoriel du développeur de Firecapture https://www.youtube.com/watch?v=361cMtyVVDQ Dans ce tuto, je n'invente rien, j'essaye d'éclaircir certains point que la vidéo n'aborde pas et qui m'ont bloqué quelques temps. Le tutoriel compatible pour tous les systèmes d'exploitations, Windows, Linux, Mac... Les logiciels nécessaires: FireCapture: http://www.firecapture.de/ Java JDK: Télécharger Windows Installer: https://www.oracle.com/java/technologies/javase-jdk13-downloads.html Suivez les quelques étapes d'installations Le chemin par défaut est toujours très bien! Vous pouvez prendre un café comme le logo le suggère Vous pouvez faire "Close" ou "Fermer" Java est le nom d'un langage de programmation né au milieu des années 90. C'est un langage dit Objet, c'est à dire que l'on va coder des objets que l'on pourra utiliser sans cette. Dans la vie de tous les jours vous êtes bien content d'avoir une fourchette pour manger vos pâtes dans une assiette. La fourchette est un objet, vous ne savez pas comment on la fabrique mais vous savez vous en servir pour manger, des pâtes, manger du poulet, cuisiner ect... En programmation orientée objet vous pouvez utiliser des objets qui peuvent être des fonctions ou des classes (une sorte de bibliothèque de fonction) et les réutiliser à souhait. Une fonction est un ensemble d'instruction qui vont fournir un résultat. Vous n'avez pas besoin de savoir comment il marche, de connaitre tout le code, pour pouvoir vous en servir, tout comme vous en connaissez probablement la séquence d'allumage d'une voiture mais vous savez vous en servir. La programmation orientée objet, c'est trivialement (si un développeur me dit il va me tuer), c'est d'avoir des objets que l'on peut utiliser et assembler comme on veut pour vu que l'on sache ce qu'il attend et ce qu'il fourni. OpenCV OpenCV est un ensemble d'objets qui permettent de réaliser des opérations sur des images, il y a derrière des maths que j'avoue ne pas comprendre et d’innombrables fonctions que je ne sais pas (encore utiliser) et pour lesquels, je n'ai pas d'application. Télécharger la version pour Windows ici: https://opencv.org/releases/ Décompresser le fichier ZIP dans votre répertoire préféré par simplicité, décompressez les fichier à la racine de votre disque dur Eclipse Bon maintenant, nous avons les composants, il nous faut maintenant un environnement pour nous aider à mettre tout cela en musique. Eclipse est très bon éditeur de code, surtout pour Java et il est gratuit, ça tombe bien non? Télécharger la version pour Windows ici: https://www.eclipse.org/downloads/ Configurer Dans cette section, va peut être vous sembler plus technique mais rassurez vous ce n'est qu'une apparence, vous n'êtes pas obliger de tout comprendre du premier, je ne crois pas qu'honnête l'on puisse tout comprendre du premier coup. Personnellement, je n'y suis pas arrivé du premier coup, c'est pour ça que j'écris ce petit tutoriel qui devient, j'espère, comme pour moi un pense bête. Bref, nous allons voir comment configurer Eclipse avec les outils dont nous avons besoin. Pour Java, c'est facile il n'y a rien à faire ça se passe tout seul! Pour OpenCV, ça demande quelques petits réglage, il faut expliquer à Eclipse où aller chercher la boite à outils OpenCV. On lance Eclipse Lors du premier démarrage Eclipse demande où l'on va enregistrer ses projets, choisissez un endroit qui vous convient Eclipse se lance et on obtient une grande fenêtre pleine de bouton! Surtout pas de Panique Rendez vous dans Windows -> Preferences Allez dans Java et sélectionnez Build Path -> User Libaries Appuyer sur New et choisissez un petit nom pour votre librairie Validez avec OK Appuyer sur Add External Jars Parcourir les dossiers pour aller sélectionner opencv-420 Valider en cliquant sur Ouvrir Fermer la fenêtre de configuration Et voila tout est configurer Il nous reste à créer un projet et créer notre premier plugin a partir de la libraire fournir par Firecapture Premier projet: Afficher en direct une mesure de la netteté Dans le Menu File choisir New -> Java Project Dans la fenêtre qui s'ouvre choisir Java -> Java Project Après avoir appuyé sur Next, une nouvelle fenêtre s'affiche Choisir un nom pour le Projet Choisir comme environnement Java SE 1.8 FireCapture ayant été construit (compilé) sous cette version de Java vous devez compiler votre projet sous cette version. On appuie sur Next Aller dans l'onglet Libraries Nous allons ajouter OpenCV en cliquant sur Add Library, voyager entre les fenêtres avec Next et valider avec Finish Puis ajouter la librairie Firecatpure en cliquant sur Add External JARs Rendez-vous dans le répertoire d'installation de FireCapture Choisir Plugin-1.1 et valider avec Ouvrir Vous devez obtenir quelque chose qui ressemble à ceci: Terminer avec Finish Et voila votre projet qui commence à prendre forme... Si vous développez vous voyez que vos librairies sont bien importées Coder, un peu! Créer le paquet qui va contenir notre Plugin sous forme de classe Comme vous l'avez vu Java fonctionne avec des paquets nommé JAR, c'est une sorte de fichier compressé dans lequel toutes les codes sources sont organisés sous formes de classes. Un peu comme des classeurs dans une étagères et Java ouvre ses classes pour en lire les fonctions, comme vous pourriez ouvrir un classeur à la recherche d'un document utile. Pour créer un paquet: Dans l'arborescende de votre projet cliquer droit sur src Aller dans New et choisir Package Introduire un nom, par exemple evalsharp le nom doit être sans espace Valider avec Finish Votre Package appariait dans l'explorateur de projet sous forme d'un carré blanc Cliquer gauche, New -> Class Introduire un nom MyPlugin par exemple Cliquer sur Add Interface c'est ici que l'on va ajouter le code source qui va permettre à votre classe de dialoguer avec Firecapture Sélectionner et valider avec OK Terminer avec Finish Votre classe est apparue dans l'explorateur de projet Et du code qui fait peur aussi! Alors codons! Chercher dans le code le texte suivant: public String getInterfaceVersion() { return null; } et remplacer null par "1.1" Mais pourquoi? Qu'est ce que c'est? public String getInterfaceVersion() est une fonction qui renvoi un String (du texte) via la commande return Noter bien que chaque commande se termine par un ; en Java La fonction que l'on vient d'éditer permet à Friecapture de s'assurer que la version du plugin est 1.1 Un nom pour notre plugin Nous allons modifier deux fonctions, l'une pour donner un nom à sa fonction et l'autre pour donner une description à sa fonction Trouver le deux fonctions suivantes: public String getName() { return null; } @Override public String getDescription() { return null; } La premier va vous permettre de donner un nom et la seconde une description. Attention à bien mettre votre texte entre " " sinon ça ne fonctionnera pas, les textes, les String, doivent toujours être entre des " ". Par exemple public String getDescription() { return "Evaluer la nettete"; } @Override public String getMaxValueLabel() { // TODO Auto-generated method stub return "Nettete"; } J'espère que vous tenez bon, maintenant on va dire à Firecapture que le plugin fonctionne avec les cameras couleurs et monochrome Pour cela, il faut modifier les fonctions suivantes: @Override public boolean supportsColor() { return false; } @Override public boolean supportsMono() { return false; } Les deux fonctions, l'une pour les caméras couleurs, l'autre pour les caméras noir et blanc renvois un booléen, c'est à dire un vrai ou faux. Il faut donc changer le deux false par true. @Override public boolean supportsColor() { return true; } @Override public boolean supportsMono() { return true; } La partie la plus dur, il va falloir modifier la fonction compute avec les calculs que l'on veut effectuer sur les frames @Override public void computeMono(byte[] bytePixels, Rectangle imageSize, CamInfo info) { //cette ligne sert à appeler la librairie opencv System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); //cette ligne sert à créer une matrice (un tableau) pour contenir tous les pixels de l'image de camera Mat image = new Mat(imageSize.width, imageSize.height, CvType.CV_8UC3);//CvType.CV_8UC3 = n&b // cette ligne sert à mettre les pixels dans la matrice que l'on vient de créer image.put(0,0, bytePixels); // cette ligne sert à faire une nouvelle matrice pour faire les calculs dedans Mat laplacian = new Mat(image.size(), CvType.CV_8UC3); // ici on va étudier avec une fonction laplacienne... en très bref on va regarder si les pixels sont tous semblables (image floue) ou très differents (nette) Imgproc.Laplacian(image, laplacian, 3); MatOfDouble median = new MatOfDouble(); MatOfDouble std= new MatOfDouble(); Core.meanStdDev(laplacian, median , std); // on enregistre le résultat dans une variable de type long fm = (long) Math.pow(std.get(0,0)[0],2); } A ce niveau vous remarquez qu'éclipse vous informe que la variable fm n'existe pas, on va la créer tout de suite en remontant tout au début du code public class MyPlugin implements IFilter { private long fm; private long fmm; Maintenant on va afficher la valeur dans firecapture @Override public String getMaxValue() { // Cette classe sert à afficher un texte dans la "textbox" du dessus, ici on va afficher la valeur de netteté max à l'aide d'une simple condition if (fm>=fmm) { fmm=fm; } return Long.toString(fmm); } @Override public String getCurrentValue() { // Cette classe sert à afficher un texte dans la "textbox" du dessous, ici on va afficher la valeur de netteté instantanée String s = Long.toString(fm); return s; } Le résultat sera le suivant: Pour que tout fonctionne, il faut encore modifier quelques lignes de codes pour faire en sorte que Firecapture mette à jour les valeurs dans l'interface. Ajouter une variable IFilterListener: public class MyPlugin implements IFilter { private long fm; private long fmm; //Ajouter cette variable pour permettre au logiciel de savoir quand un calcul est fini private IFilterListener captureListener; Appeler la fonction listener dans compute: @Override public void computeMono(byte[] bytePixels, Rectangle imageSize, CamInfo info) { //cette ligne sert à appeler la librairie opencv System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); //cette ligne sert à créer une matrice (un tableau) pour contenir tous les pixels de l'image de camera Mat image = new Mat(imageSize.width, imageSize.height, CvType.CV_8UC3);//CvType.CV_8UC3 = n&b // cette ligne sert à mettre les pixels dans la matrice que l'on vient de créer image.put(0,0, bytePixels); // cette ligne sert à faire une nouvelle matrice pour faire les calculs dedans Mat laplacian = new Mat(image.size(), CvType.CV_8UC3); // ici on va étudier avec une fonction laplacienne... en très bref on va regarder si les pixels sont tous semblables (image floue) ou très differents (nette) Imgproc.Laplacian(image, laplacian, 3); MatOfDouble median = new MatOfDouble(); MatOfDouble std= new MatOfDouble(); Core.meanStdDev(laplacian, median , std); // on enregistre le résultat dans une variable de type long fm = (long) Math.pow(std.get(0,0)[0],2); //fonction à ajouter pour permetre à fireacapture de savoir que l'on est au bout du calcul captureListener.filterDone(this); } Rendre actif la fonction listener @Override public void registerFilterListener(IFilterListener listener) { captureListener = listener; } Nous y sommes presque, il nous faut maintenant mettre tout ça dans un paquet l'enregistrer dans le répertoire Plugins de FireCapture On créé un sous dossier dans le répertoire Plugins Dans Eclipse, nous exportons le paquet dans le dossier que l'on vient de créer, pour ce faire: Clic Droit -> Export sur le nom de votre classe: Dans la fenêtre, on choisi JAR et on valide avec Next Ensuite on choisit où exporter: On valide avec Finish Avant de lancer fébrilement Firecapture pour voir le résultat, il faut copier deux fichiers. Le premier opencv_java420.dll doit être copié de C:\opencv\build\java\x64 à C:\FireCapture_v2.6_x64 Le second opencv-420.jar doit être copié de C:\opencv\build\java\ à C:\FireCapture_v2.6_x64\plugins\x64\MyPlugin Pour la première utilisation, je vous conseille de lancer Firecapture en mode debug comme ça vous pourrez consulter les erreurs Il faut indiquer combien de mémoire vive vous allouez à Friecapture et valider avec Enter Choisir la caméra, c'est plus facile avec la caméra factice DummyCam Firecapture indique qu'il a bien chargé votre plugin Et il s'affiche ici!
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.