Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ...).