7

Une simple recherche google nous donne de très nombreux moyen de changer de fond d’écran en prenant une image aléatoirement dans un dossier. Par contre je ne pense pas qu’il en existe qui modifie la couleur de votre conky en fonction !


Attention ! Le code source sur cette page n’est plus à jour, veuillez télécharger le code présent sur la page codes.

Petit avertissement ce script ne fonctionne malheureusement que dans gnome. Si quelqu’un connait l’alternative à la commande gconftool pour kde, xfce et les autres, n’hésitez pas.

Ce script est encore tout jeune (date de hier soir) et je vais donc le modifier (améliorer j’espère) au fur et à mesure du temps. N’hésitez aps à me faire part de vos conseils.

Présentation

Conky

Pour ceux qui ne connaissent pas pas, conky est un logiciel pour Linux et FreeBSD qui permet de surveiller à peut prêt tout ce qui se passe sur le disque et de l’afficher sur votre bureau dans un style +/- joli mais certainement très geek. En vrac, il peut vous afficher les processus en cours, l’espace libre de vos disques, la température de votre CPU, la météo, la musique que vous écoutez via MPD,… la liste est très grande et en fait quasi infinie puisque l’on peut intégrer à peut prête n’importe quoi. Si vous avez le temps, jetez un coup d’œil sur google, il y a de quoi satisfaire tout le monde et en se donnant un peu de mal à faire quelque chose de joli.

OpenCV

OpenCV est une librairie libre de vision par ordinateur. C’est celle que j’ai utilisé dans mon script c++. Cette librairie permet de faire vraiment des choses fantastiques. On peut ainsi analyser des images statiques (ce que je fais très simplement dans mon script) mais aussi des vidéos et permettre la détection du mouvement, reconnaissance des visages, interaction avec sa webcam. Ce n’est pas ce qui a de plus facile mais les résultats sont impressionnant de voir ce qu’on peut faire avec des outils distribués gratuitement et librement.
Pour l’utilisation d’OpenCv 2 sous linux, je vous conseille cette page.

Cron

Cron est un utilitaire permettant de planifier des tâches à exécuter à un moment donné. Cet outil est fort populaire sur les jeux web pour permettre de donner des points d’actions toutes les 15 minutes par exemple. Mais sur un ordinateur personnel, il est aussi très pratique pour les tâches d’administration, de sauvegarde,… Nous l’utilisions ici pour faire changer le fond d’écran à un temps déterminé.

Le fonctionnement

Avant la pratique, un peu de théorie pour expliquer le fonctionnement. Ce programme est composé de deux scripts : un bash (je compte regarder pour le transformer en python que je préfère) et un c++ utilisant la librairie OpenCV. Le bash, appelé random-background.sh, commence par sélectionné une image aléatoire dans un dossier donné. Il modifie ensuite le fond d’écran avec la commande gconftool. Le script c++, appelé conkywallpaper est appelé en passant en paramètre le nom de l’image et les dimensions du conky. Avec la couleur retournée par ce dernier, il suffit de modifier la ligne adéquate dans le fichier .conkyrc

J’ai créé un script c++ utilisant la librairie OpenCV qui analyse l’image à l’emplacement du conky et détecte la couleur principale. Ce script scan en fait pixel par pixel dans la zone définie et pour chacun vérifie si la couleur est plutôt noir ou blanche. En fin de compte la couleur qui a le plus de pixel est renvoyée.

En rajoutant une tâche cron

Le code

Bash

[cc lang="bash"]#! /bin/bash
## dependances : randomize-lines

## pour que le script fonctionne via cron
export DISPLAY=0

while read line ; do
echo $line | grep -vqe “^#”
if [ $? -eq 0 ]; then export $line; fi
done < ~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-$DISPLAY

## position du conky
widthmin=0.8
widthmax=1
heightmin=0.1
heightmax=0.6
## chemin vers le dossier contenant tout les fonds d’ecran
pathToImage=”$HOME/Images/wallpaper/”

img=”`find $pathToImage -name *.jpg | rl | tail -n 1`”
/usr/bin/gconftool -t str -s /desktop/gnome/background/picture_filename $img

res=”`$HOME/script/wallpaper/conkywallpaper $img $widthmin $widthmax $heightmin $heightmax`”

sed “s/default_color .*/default_color $res/” $HOME/.conkyrc > $HOME/newconky

mv $HOME/newconky $HOME/.conkyrc[/cc]

OpenCV

[cc lang="c++"]#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>

#include <algorithm>

#include <iostream>

IplImage *img;
IplImage *img_nvg;

int main(int n, char *params[])
{

//on verifie l’existance du fichier
FILE* fp = NULL;
fp = fopen(params[1], “rb” );
if( fp != NULL )
{

fclose( fp );

//Initialisations
img=cvLoadImage(params[1]);

int seuil = 127;

int widthmin = img->width * atof(params[2]);
int widthmax = img->width * atof(params[3]);
int heightmin = img->height * atof(params[4]);
int heightmax = img->height *atof(params[5]);

int blanc = 0;
int noir = 0;

CvScalar scalaire;

//On parcourt toute l’image
for(int x=widthmin; x<widthmax; x++)
{
for(int y=heightmin; y<heightmax; y++)
{

//On récupère le pixel de coordonnées (x,y)
scalaire=cvGet2D(img, y, x);

//Si le niveau de gris est inférieur à p_min, il devient p_min
if(scalaire.val[0]<seuil)
{
blanc++;
}
else
{
noir++;
}
}
}

if (blanc > noir)
{
std::cout << “white” << std::endl;
}
else
{
std::cout << “black” << std::endl;
}

}
else
{
std::cout << “fichier n’existe pas” << std::endl;
}

return 0;
}[/cc]

Cron

*/20 * * * * ~/script/wallpaper/random-background.sh

Utilisation

Tout d’abord créez deux fichiers que vous appellerez random-background.sh et conkywallpaper.cpp dans lequel vous copierez le code bash et c++. J’ai placé ces scripts dans le dossier /home/mon_user/script/wallpaper si vous les les placez ailleurs n’oubliez pas de changer le chemin (dans le cron pour le fichier bash et ligne 25 du fichier bash pour le fichier c++). Rendez le script bash exécutable : bouton droit > propriétés > permissions > rendre exécutable ou

$ chmod +x ~/script/wallpaper/random-background.sh

compilez le script c. Il vous faut avoir installé les paquets (je vous laisse libre de la méthode) libcv1 libcvaux1 libhighgui1 libcv-dev libcvaux-dev libhighgui-dev opencv-doc et puis utilisez la commande dans le répertoire contenant le fichier c++

$ g++ conkywallpaper.cpp -o conkywallpaper -lcv -lhighgui

qui vous produira un joli fichier conkywallpaper à placer à coté de random-background.

Maintenant passons au cron. Pour modifier la liste de vos tâches faites

$ crontab -e

et ajoutez la liste la ligne cron que je donne un peu plus haut. Ici c’est réglé pour changé le fond toutes les 20 minutes. Pour plus de détails sur les différentes possibilités, allez voir ici.

L’emplacement vers le dossier qui contient toutes les images est contenu dans la variable pathToImage dans le script bash (ici /home/mon_user/Images/wallaper), la recherche se fait récursivement donc vous pouvez faire des sous-dossier ou des liens vers d’autres dossiers (attention aux boucles infinies) et il ira dedans. Les dimensions du conky sont données dans les 4 premières variables du script bash. 0.8 1 0.1 0.6 signifie que le conky démarre horizontalement à 80% de mon écran jusque le bord droit (100%) et verticalement commence à 10% et se fini à 60%. C’est à vous d’approximer cela.

Si vous avez des remarques n’hésitez pas.

7 commentaires

  1. LGnap says:

    J’aime beaucoup ton idée et ton script, j’ai un conky multicolore (4 segments * 2 couleurs) et mon envie serait de trouver automatiquement la couleur se voyant le plus pour chaque segment de mon conky (http://www.helpcomputer.be/upload/conky.png) .

    Merci pour la piste en tout cas. Je bosse sur ton script et je vois.

  2. mart says:

    Heureux que tu aimes.

    Une solution pour ce que tu cherches à faire serait de le diviser en 4 conky différents pour lesquels tu fais tourner le script de détection à des endroits différents.
    “conky -c ~/.custom-conkyrc” pour lancer conky avec un fichier de configuration en particulier.

    Une autre solution serait dans ton .conkyrc de définir 4 couleurs différentes (si ce n’est déjà fait) style :
    default_color FFFFFF #blanc
    default_shade_color 333333
    default_outline_color black
    color1 e49c16
    color2 CA0000
    color3 EEEEEE
    color4 DDDDDD

    Et de modifier un peu le script bash pour qu’il detecte aussi 4 fois à 4 positions différentes

  3. LGnap says:

    J’ai en effet déjà plusieurs couleurs différentes définies dans conky (default, color0 -> color6) et ce qui retient surtout mon attention c’est comment trouver automatiquement la couleur se voyant le plus sur une couleur donnée (le simple négatif est rarement beau sur une image) et puis je ferais une moyenne des 3 canaux (BGR) récoltés de la dite zone (faut encore que je localise correctement le prélèvement aussi) pour en calculer cette fameuse couleur miracle.

  4. mart says:

    Ah oui en effet c’est vrai que moi je ne travaillait qu’en noir et blanc et je n’avais pas songé à ça.
    Il faut faire des tests pour voir ce qui donne le mieux.
    J’utilise la librairie opencv parce que c’est la seule que je connaisse (et j’avais la flemme d’en chercher d’autres) mais il doit en avoir plein d’autres (parce qu’utilisé opencv juste pour ça, ça revient un peu à tuer un moustique au bazoaka).

    Tient moi au courant si tu as trouvé

  5. LGnap says:

    Voilà je te tiens au courant comme demandé. En tripotant pas mal ton opencv script j’ai réussi à faire un script qui me calcule la couleur moyenne d’une zone au choix d’une image
    genre ça :
    [lgnap@lgnapc Debug]$ ./ConkyColor ~/Images/WallPapers/essai-lotus-elise-su-2_1280x0w.jpg 0 500 355 600
    181.277 60.9818 18.2211
    Image et délimiteurs de la zone voulue en entrée, valeur RGB en sortie.
    J’ai en effet vu que opencv est un gros machin, mais j’en connais pas d’autre non plus, et la tienne marche…
    Plus qu’a appeler 4 fois le script avec les zones encore à délimiter et puis calculer une couleur qui se voit bien -> j’vais commencer par un pur négatif on verra pour la suite après

  6. mart says:

    J’ai mis à jour le code pour le rendre compatible avec la nouvelle version d’opencv (et 2, 3 ptites corrections) et publié sur la page code. Désormais je mettrai à jour (et publierai) les codes sur cette page uniquement.

  7. [...] J'ai commencé en mettant le code source remis à jour (il fonctionnait le précédent ?) concernant le changement de couleur du conky. [...]

Laissez un commentaire




Avatars par gravatar, balises html classiques autorisées.