Aller au contenu

Ecrire son premier Plugin pour Firecapture en Java


Messages recommandés

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: 

 

image.thumb.png.1ccb2bcc8445c7effa8b8952fe3edf68.png

 

  • Suivez les quelques étapes d'installations 

 

image.png.828d3a9bf3a6014cb32665448c13e93a.png

 

Le chemin par défaut est toujours très bien!

 

image.png.487bacff5b0269458965f0c72868e7f9.png

 

Vous pouvez prendre un café comme le logo le suggère

 

image.png.be9de07b71185a9fa4e97ff2dd8ed225.png

 

Vous pouvez faire "Close" ou "Fermer"

 

image.png.23e6fde80271c13c868646c7fbec2e6c.png

 

 

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. 

 

 

image.thumb.png.deaef1f663cf9d314d60e58aeedafbfb.png

 

  • Décompresser le fichier ZIP dans votre répertoire préféré par simplicité, décompressez les fichier à la racine de votre disque dur

 

image.png.568d79c7ed78b5963a89ac4a3e82a265.png

 

 

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/

 

image.png.5826061a74b943220101301af6acf950.png

 

 

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.

 

  1. On lance Eclipse

    image.png.84860875474278242eacdc68638612be.png
     
  2. Lors du premier démarrage Eclipse demande où l'on va enregistrer ses projets, choisissez un endroit qui vous convient
     
  3. Eclipse se lance et on obtient une grande fenêtre pleine de bouton! Surtout pas de Panique
     
  4. Rendez vous dans Windows -> Preferences
    image.png.d0c19bddd8f1d6e5c9ad5fe11bd114e1.png

     
  5. Allez dans Java et sélectionnez Build Path -> User Libaries
    image.png.f013d761c2f6b681938175121388266a.png
     
  6. Appuyer sur New et choisissez un petit nom pour votre librairie

    image.png.eeeec55a2f06dcf9b98fb270564ceca3.png
     
  7. Validez avec OK
    image.png.c57088154980c6587f1cad769adb879d.png

     
  8. Appuyer sur Add External Jars
  9. Parcourir les dossiers pour aller sélectionner opencv-420

    image.png.94d63cff51bbecf6826a6ed96a52368a.png
     
  10. Valider en cliquant sur Ouvrir
  11. 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

 

image.png.8581b56c9188508bf9d388c4596e765c.png

 

Dans la fenêtre qui s'ouvre choisir Java -> Java Project

 

image.png.ac0118f65889f53c892ac906d7f62ada.png

 

Après avoir appuyé sur Next, une nouvelle fenêtre s'affiche

 

image.png.fbdd763592ce2996690c92caee6efd9c.png

 

  • 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

    image.png.858dc06502515fc438db1772e047eb90.png
     
  • Aller dans l'onglet Libraries

    image.png.3b0c6eabdae61fa4cde6c226c7a0b07e.png
     
  • Nous allons ajouter OpenCV en cliquant sur Add Library, voyager entre les fenêtres avec Next et valider avec Finish 

    image.png.0626d931baf6056d10a00e2263079a35.png


    image.png.2dc4348ed9785c8e1b1f965cfdc37a41.png
     
  • Puis ajouter la librairie Firecatpure en cliquant sur Add External JARs
    image.png.84edd406847c030bb0c94aec7bce6a1a.png
     
  • Rendez-vous dans le répertoire d'installation de FireCapture

    image.png.122dc0605f3e74c098dea12c318c247a.png
     
  • Choisir Plugin-1.1 et valider avec Ouvrir
  • Vous devez obtenir quelque chose qui ressemble à ceci:

    image.png.f8ca7c503213a44ac0f8122eb84a8a33.png
     
  • Terminer avec Finish

    image.png.0b686ec04709089169aecf538c227361.png

 

Et voila votre projet qui commence à prendre forme...

Si vous développez vous voyez que vos librairies sont bien importées

 

image.png

image.png

 

 

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
    image.png.94b58ee94d6a8f3b43e984c06f3db75d.png
  • Aller dans New et choisir Package
    image.png.009c9fa474c2274a7c44c0c657e8d8b0.png
     
  • Introduire un nom, par exemple evalsharp le nom doit être sans espace 

    image.png.f8afb34d72975915acd5f2dad5146a48.png
     
  • Valider avec Finish
  • Votre Package appariait dans l'explorateur de projet sous forme d'un carré blanc

    image.png.39c9bb1c430836c7b7926c78b82f246e.png
     
  • Cliquer gauche, New -> Class
    image.png.2942b22d9ba615cbf87eef63e13f061b.png

     
  • 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

    image.png.3942ea4b42660ceaf568fa143df2e179.png
     
  • Sélectionner et valider avec OK

    image.png.8c9deedbcafd11098a80738a8db57ed6.png
     
  • Terminer avec Finish

Votre classe est apparue dans l'explorateur de projet

 

image.png.4835591068937cbb1586e40942a774d4.png

 

Et du code qui fait peur aussi!

 

image.png.1c5421886c08d7199f057d468500b7e1.png

 

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:

 

image.png

 

 

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

 

image.png.f97b5310d4b6d5d4083d501ed685afd0.png

 

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:

 

image.png.dd59e43198a780aecee584ed387a40fb.png

 

Dans la fenêtre, on choisi JAR et on valide avec Next

 

image.png.b1bdd7f9d00188c5cde5a7ff938423a7.png

 

Ensuite on choisit où exporter:

 

image.png.b665f32779a83e25e54c08e20002102b.png

 

 

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

 

image.png.a175c9f272e1ee250ce2cbc1d421907e.png

 

Il faut indiquer combien de mémoire vive vous allouez à Friecapture et valider avec Enter

 

image.png.19ce1645692edb4498ec39e4fee93f0f.png

 

Choisir la caméra, c'est plus facile avec la caméra factice DummyCam

 

image.png.4c70aa281dc3b4fabf7c09ae80a9a5bd.png

 

Firecapture indique qu'il a bien chargé votre plugin

 

image.png.2d73269a593d2c9f7c5656bc8e95b7e9.png

 

Et il s'affiche ici!

 

image.png.dcee325c0323b2d6e6002eb54da84549.png

 

 

 

 

 

Modifié par DrThrax
  • J'aime 2
Lien vers le commentaire
Partager sur d’autres sites

  • 9 mois plus tard...

C'est cool de mettre un peu en avant ce langage génial au travers de ce pas à pas super bien réalisé ! Et oui Java c'est multi-plateforme et multi-support, c'est plus simple à aborder que le traditionnel C++, il est 100% modulaire, il n'y pas la mémoire à gérer, il est très facile à débuguer (on navigue directement dans le code source que l'on comprend) ainsi on peut se concentrer pleinement sur les fonctionnalités et puis on a accès à un vaste écosystème très mature qui permet de résoudre efficacement 99% des problèmes posés !  Par exemple le coeur de la plateforme de Netflix repose sur Java (microservices) et beaucoup de scientifiques l'utilisent aussi. Eclipse c'est très bien comme IDE, je peux en parler j'ai bossé 15 ans avec mais je suis depuis passé à Intellij (gratuit lui aussi) nettement plus performant et offrant plus de fonctionnalité pratiques pour le développeur. 😀

Lien vers le commentaire
Partager sur d’autres sites

Le 09/01/2021 à 15:26, jgricourt a dit :

C'est cool de mettre un peu en avant ce langage génial au travers de ce pas à pas super bien réalisé ! Et oui Java c'est multi-plateforme et multi-support, c'est plus simple à aborder que le traditionnel C++, il est 100% modulaire, il n'y pas la mémoire à gérer, il est très facile à débuguer (on navigue directement dans le code source que l'on comprend) ainsi on peut se concentrer pleinement sur les fonctionnalités et puis on a accès à un vaste écosystème très mature qui permet de résoudre efficacement 99% des problèmes posés !  Par exemple le coeur de la plateforme de Netflix repose sur Java (microservices) et beaucoup de scientifiques l'utilisent aussi. Eclipse c'est très bien comme IDE, je peux en parler j'ai bossé 15 ans avec mais je suis depuis passé à Intellij (gratuit lui aussi) nettement plus performant et offrant plus de fonctionnalité pratiques pour le développeur. 😀

 

Merci,

 

J'ai essayé de montrer un autre aspect de notre passion et démystifier la programmation qui fait peur.

On peut s'amuser, l'application ne sera peut être pas la plus optimisée mais on apprend et on peut donner vie!

Lien vers le commentaire
Partager sur d’autres sites

  • 1 année plus tard...

Merci DrTrax d’essayer de nous démystifier l’utilisation de Java -en particulier pour cet excellent logiciel qu’est FireCapture.
Il est sans doute possible de procéder par analogie pour traiter d’un besoin proche mais bien plus compliqué de construire sa propre fonction! Je serai personnellement intéressé par un plugin capable de faire du traitement par ondelettes en temps réel…

Est-ce envisageable (vitesse de calcul?) et où peut on trouver des "numerical recipes in Java" pour ça ?

Merci d’enrichir ce fil de discussion…

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation !

Vous pouvez répondre maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous pour poster avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • 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.