IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

ajouter bruit gaussien à une video


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Système Embarqué
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Système Embarqué
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut ajouter bruit gaussien à une video
    Bonjour a tous,

    je suis entrain de realiser un petit projet sur C qui consiste a lire une video YUV , de faire une copie de cette derniere et d'ajouter un bruit gaussien a la version copié, cest a dire la video original ne doit pas etre modifier et le resultat de la modification doit etre visible sur la deuxieme video.
    pour l'addition du bruit gaussien je dois utiliser la methode Polar (Polar Method)
    https://en.wikipedia.org/wiki/Marsaglia_polar_method
    maintenemant je vais vous montrer mon travail et dites moi ce que vous pensez.
    le code bien evidement nest pas fonctionnel, j'ai bien pu lire le premier fichier (video) et de faire une copie sans modifier le contenu et je n'arrive pas d'implimenter la function Polar sur la version copié, donc si vous avez une idée a ce sujet, n'hesitez pas a me repondre.
    (PS: desoler pour le français cassé, je suis un etudiant étranger en Allemagne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    void polar(double *x1, double *x2) //methode polar
    {
       double u, v, q, p;
     
       do {
          u = 2.0 * ((float) rand()/RAND_MAX) - 1;
          v = 2.0 * ((float) rand()/RAND_MAX) - 1;
          q  = u * u + v * v;
       } while (q >= 1.0 || q == 0.0);
     
       p = sqrt(-2 * log(q) / q);
       *x1 = u * p;
       *x2 = v * p;
    }
    int main(void) {
        FILE *fp1, *fp2;
       double a1,a2;
    	fp1= fopen("FOOTBALL_352x288_30_orig_01.yuv","rb");
    	 if (fp1 == NULL)
      	{
        exit(1);
      	}
    	fp2= fopen("FOOTBALL_352x288_30_copy_02.yuv","wb");
        if (fp2 == NULL)
      	{
        exit(1);
      	}
     
     
    int buffer;
    while(!feof(fp1))
     
    	{
    		 fread((void *)&buffer, sizeof(buffer),1,fp1);
    		polar(&a1,&a2);
     
     
    		fwrite((void *)&a1,sizeof(buffer),1,fp2);
    	}
     
        fclose(fp1);
        fclose(fp2);
     
    	return 0;
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Ligne 32 : on ne doit utiliser feof() que pour connaître une cause d'erreur pas pour savoir si la fin de fichier est atteinte. pour cela il faut commencer essayer de lire, et c'est le résultat de fread() qui dira si la fin a été atteinte ou pas. A vérifier : Le fichier résultat a exactement la même taille que le fichier initial.
    Ligne 35 : tu lis dans un fichier une donnée entière de la taille d'un int. La taille d'un int ça ne veut rien dire en C (ça dépend), il faut lire des données dont la taille correspond au données dans le fichier. Pour cela il faut bien se renseigner sur le format. Par exemple si la taille est 1 octet, le type à utiliser est uint8_t.
    Ligne 36 : tu supposes que par magie l'entier précédemment lu dans buffer a été transféré et converti dans a1. Il manque du code. D'autant que buffer est peut-être un nombre de 0 à 255, et a1 serait un double de 0.0 à 1.0.
    Ligne 37 : Ici aussi magie de a2 vers rien. Et c'est a1 (donc un double) au lieu d'un a2 converti qui est écrit, et ce en utilisant la taille d'un int!

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonjour,
    Contrairement à ce qui a été dit feof permet de détecter la fin de fichier elle renvoie 0 lorsque la fin de fichier n'est pas atteinte ou autres valeurs non-nulles dans le cas contraire ; de plus, l'emploi de feof sur le format YUV est justifié, car il est utilisable sur des fichiers aussi bien en mode binaire/mode texte. Ceci dit si vous souhaitez détecter des éventuelles erreurs lors du traitement du fichier, il faut utiliser ferror..

    Effectivement, il faut se renseigner sur le format du fichier au préalable (Connaître les spécifications ; donc, structure du fichier) pour pouvoir manipuler les données souhaitées et ainsi évité de modifier à l'aveugle le fichier (écraser ou alterner de manière significative le fichier) et le rendre illisible.

    à bientôt

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    documentation de la fonction feof()
    Dans le code précédent, un int de trop est lu.

  5. #5
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Citation Envoyé par dalfab Voir le message
    documentation de la fonction feof()
    Dans le code précédent, un int de trop est lu.
    Dans la documentation de feof que vous proposez, il est écrit que feof vérifie si la fin du flux de fichiers a été atteinte et dans ce cas renvoie une valeur non-nulle. Et quand bien même s'il y a lecture de trop ou erreur, le seul moyen de déterminer une erreur ou que l'on a atteint la fin du fichier est l'emploi de ferror et feof, sachant que fread ne fait aucune distinction entre la fin du fichier et une erreur donc même avec l'emploi de fread, il faut distinguer la fin du fichier et une erreur.

    À bientôt;

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Ce que dalfab cherchait à dire, ce n'est pas la pertinence de feof() contre ferror(), c'est que ces deux fonctions ne doivent être appelées qu'après un échec d'une fonction de lecture (ici, fread()).
    En termes simples, toute boucle while(!feof(file)) est fausse.

    La bonne façon, c'est un truc de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while((nbLus=fread(file, ...)>=0)
    {
    	//Traitement
    }
    if(feof(file))
    {
    	//Succès! Le fichier a été lu jusqu'à la fin
    }
    else
    {
    	//Erreur! fread() a échoué pour une autre raison que "fin de fichier"
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [Débutant] Ajouter une bruit gaussien à une video
    Par nadou nadouch dans le forum Images
    Réponses: 1
    Dernier message: 19/03/2013, 09h18
  2. Comment ajouter un bruit gaussien
    Par kchiheb dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/10/2008, 17h09
  3. Ajouter un bruit gaussien à une image
    Par SmileSoft dans le forum C++
    Réponses: 35
    Dernier message: 18/04/2008, 05h54
  4. Réponses: 0
    Dernier message: 08/04/2008, 19h19
  5. Ajouter du texte sur une vidéo
    Par ChIcKeN78 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 01/06/2005, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo