Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 09/01/2013, à 00:13

MiteKudasai

OpenCV et logiciel de cryptage - Problème de couleurs

Bonjour à tous !

Je me suis mis depuis peu à utiliser OpenCV pour pouvoir faire de la modification photo, ce qui m'a permis par la même occasion d'avancer mon projet de la Fac, c'est à dire réaliser un logiciel de cryptage photo.

Alors no problèmes avec le programme, j'arrive à crypter ou plutôt "mélanger" les pixels d'une image pour ensuite les "démélanger" grâce à mon code, mais apparaît alors un problème un peu bête, je perds les couleurs avec les images jpeg et je ne comprends vraiment pas pourquoi ?

Dans mon code, je génère une position où va atterrir un pixel, que je stock ensuite dans un fichier.txt pour ensuite décrypter la photo à l'aide de ce fichier.

Voila mon code pour le cryptage :

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <time.h>

void Crypto(const IplImage* base, IplImage* final)
{

    srand(time(NULL));

    int x, k;
    int i, j;
    int **OCC = NULL;
    FILE *xfile = NULL;
    CvScalar p, p2;

    OCC = malloc(base->height* sizeof(int*));
    if(OCC == NULL)
        exit(EXIT_FAILURE);

    for(i = 0; i < base->height; i++)
    {
        OCC[i] = malloc(base->width * sizeof(int));
        if(OCC[i] == NULL)
            exit(EXIT_FAILURE);
    }

    for(j = 0; j<base->height; j++)
        for(i = 0; i<base->width; i++)
            OCC[j][i] = 0;

    xfile = fopen("xfile.txt", "w+");

    for(j = 0; j < base->height; j++)
    {
        for(i = 0; i < base->width; i++)
        {
            do
            {
                x = (rand()%(base->width));
            }
            while(OCC[j][x] == 1);
            OCC[j][x]++;
            fprintf(xfile, "%d ", x);

            for (k = 0; k < base->nChannels; ++k)
            {
                p2 = cvGet2D (base, j, x);
                p.val[k] = p2.val[k];
            }
            cvSet2D (final, j, i, p);
        }
    }

    fclose(xfile);
}

int main (int argc, char* argv[])
{
    IplImage* base = NULL;
    IplImage* final = NULL;
    const char* src_path = NULL;
    const char* dst_path = NULL;
    const char* window_title = "Crypto";

    if (argc < 3)
    {
        fprintf (stderr, "usage: %s IMAGE [SAVE_PATH]\n", argv[0]);
        return EXIT_FAILURE;
    }

    src_path = argv[1];
    dst_path = argv[2];

    if (!(base = cvLoadImage (src_path, CV_LOAD_IMAGE_UNCHANGED)))
    {
        fprintf (stderr, "couldn't open image file: %s\n", src_path);
        return EXIT_FAILURE;
    }

    final = cvCreateImage (cvGetSize (base), IPL_DEPTH_8U, 4);

    Crypto(base, final);

    cvNamedWindow (window_title, CV_WINDOW_AUTOSIZE);
    cvShowImage (window_title, final);

    cvWaitKey(0);
    cvDestroyAllWindows();

    if (dst_path && !cvSaveImage (dst_path, final, NULL))
    {
        fprintf (stderr, "couldn't write image to file: %s\n", dst_path);
    }

    cvReleaseImage(&base);
    cvReleaseImage(&final);

    return EXIT_SUCCESS;
}

Et pour le décryptage :

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

void Decrypt(const IplImage* base, IplImage* final)
{
    int x;
    int k;
    int i, j;
    FILE *xfile = NULL;
    CvScalar p, p2;

    assert (base->depth == IPL_DEPTH_8U);

    xfile = fopen("xfile.txt", "r");

    for(j = 0; j < final->height; j++)
    {
        for(i = 0; i < final->width; i++)
        {
            fscanf(xfile, "%d", &x);

            for (k = 0; k < final->nChannels; ++k)
            {
                p2 = cvGet2D (base, j, i);
                p.val[k] = p2.val[k];
            }
            cvSet2D (final, j, x, p);
        }
    }

    fclose(xfile);
}

int main (int argc, char* argv[])
{
    IplImage* base = NULL;
    IplImage* final = NULL;
    const char* src_path = NULL;
    const char* dst_path = NULL;
    const char* window_title = "Crypto";

    if (argc < 3)
    {
        fprintf (stderr, "usage: %s IMAGE [SAVE_PATH]\n", argv[0]);
        return EXIT_FAILURE;
    }

    src_path = argv[1];
    dst_path = argv[2];

    if (!(base = cvLoadImage (src_path, CV_LOAD_IMAGE_UNCHANGED)))
    {
        fprintf (stderr, "couldn't open image file: %s\n", src_path);
        return EXIT_FAILURE;
    }

    final = cvCreateImage (cvGetSize (base), IPL_DEPTH_8U, 4);
    Decrypt(base, final);

    cvNamedWindow (window_title, CV_WINDOW_AUTOSIZE);
    cvShowImage (window_title, final);

    cvWaitKey(0);
    cvDestroyAllWindows();

    if (dst_path && !cvSaveImage (dst_path, final, NULL))
    {
        fprintf (stderr, "couldn't write image to file: %s\n", dst_path);
    }

    cvReleaseImage(&base);
    cvReleaseImage(&final);

    return EXIT_SUCCESS;
}

Si quelqu'un a une explication je suis preneur big_smile

Hors ligne

#2 Le 16/01/2013, à 14:29

compte supprimé

Re : OpenCV et logiciel de cryptage - Problème de couleurs

Tu ne perds pas de couleur au sens propre du terme, j'ai testé et tu as un décalage quelque part (essaye avec une image simple, comme par exemple un cercle chromatique sur fond blanc en basse résolution).
C'est parce tu as des décalages et que tu testes sur une image avec une bonne résolution, que tu as l'impression qu'elle pâlit (si on mélange les couleurs primaires, ça donne du blanc ...).

Haut de page ↑