Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > OpenCV
OpenCV Vos questions sur l'API de traitement d'images OpenCV.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/11/2012, 16h16   #1
kevin39300
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2012
Messages : 5
Points : 0
Points : 0
Par défaut Stéganographie

Bonjour je dois faire un encodeur prenant une image grayscale en entrée et l'ajouter a un message binaire. mo image de sortie cache bien mon message mais j'ai de l'overflow(debordement) et je ne comprends pas pourquoi.

Merci de votre aide: ci dessous le code

Code :
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <cv.h>   	// open cv general include file
#include <highgui.h>	// open cv GUI include file
#include <iostream>	// standard C++ I/O
 
using namespace cv; // OpenCV API is in the C++ "cv" namespace
using namespace std;
 
int main( int argc, char** argv )
{
 
  Mat inputImg;;  // inputobject
  Mat msgImg;	 //msgobject
  Mat outputImg(Size (640,480),0);  //outputImg
  std::vector<int>params;
  const string windowName = "OPENCV: basic image display"; // window name
 
  // check that command line arguments are provided and image reads in OK
 
  if((argc == 4) && !(inputImg = imread( argv[1],  0)).empty())
    {
      // create window object
 
 
 
      // display image in window
 
 
 
		msgImg = imread( argv[2],0);
 
 
 
	  // inverted binary image
 
 
	  for(int i=0; i<msgImg.rows; i++)
	  {
		  for(int j=0; j<msgImg.cols; j++)
		  {
 
		  if(msgImg.at<uchar>(i,j)==255)
		  msgImg.at<uchar>(i,j)=0;
		  if(msgImg.at<uchar>(i,j)==0)
		  msgImg.at<uchar>(i,j)=1;
 
 
 
		  outputImg.at<uchar>(i,j) = inputImg.at<uchar>(i,j) + msgImg.at<uchar>(i,j);
		  if(outputImg.at<uchar>(i,j)>255)
			  outputImg.at<uchar>(i,j)=255;
		  if(outputImg.at<uchar>(i,j)<0)
			  outputImg.at<uchar>(i,j)=0;
		  }
	  }
 
	  imshow("Output image",outputImg);
 
	  imwrite(argv[3], outputImg, params);
 
      waitKey(0); 
 
      // all OK : main returns 0
 
      return 0;
    }
 
    // not OK : main returns -1
 
    return -1;
}
kevin39300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 16h58   #2
math_lab
Membre chevronné
 
Homme
Chercheur en informatique
Inscription : avril 2008
Messages : 328
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Chercheur en informatique

Informations forums :
Inscription : avril 2008
Messages : 328
Points : 620
Points : 620
Déjà, pense a mettre la balise code dans ton message, parce que sinon, c'est difficile a lire.

Ton problème vient du fait que tu ajoutes deux uchars pour en faire un autre uchar et que tu ne peux pas tester le débordement pour une variable d'un certain type sans passer par un type plus large. Il faut d'abord les transformer en int, les ajouter dans un autre int, tester le débordement, et ensuite seulement le convertir en uchar.
math_lab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 17h24   #3
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 175
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 175
Points : 12 665
Points : 12 665
Bonjour,

Il n'y a pas obligatoirement besoin de passer par un int. Une simple transformation du test de a + b > 255 à a > 255 - b est suffisant.

Remarque :
Code :
1
2
if(outputImg.at<uchar>(i,j)<0)
    outputImg.at<uchar>(i,j)=0;
étant donné que tu travailles avec des uchar (ou unsigned char), ce test est inutile.
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2012, 20h38   #4
kevin39300
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2012
Messages : 5
Points : 0
Points : 0
Par défaut sujet de l'exercice

Citation:
implement an encoder program that takes as input an 8bits grayscale carrier image and a 8bits binary image and produces an encoding images with the message added to the lower bits of the carrier.
Add binary 0(black) as +1 and 255(white) as +0 to the encoded image to minimise the change in the encoded image (ie add inverted binary image).
mon code correspond à ses critère. j'ai bien inverser l'image binaire( mon message) pour ensuite l'additionner a mon input image. la sortie( encodedimage) doit ressembler a l'input normalement.
kevin39300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 20h49   #5
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 175
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 175
Points : 12 665
Points : 12 665
Vu l'algorithme, je te conseille dans un premier temps de reconsidérer ces lignes :
Code :
1
2
3
4
if(msgImg.at<uchar>(i,j)==255)
    msgImg.at<uchar>(i,j)=0;
if(msgImg.at<uchar>(i,j)==0)
    msgImg.at<uchar>(i,j)=1;
Surtout pour une valeur initiale de 255
Citation:
Envoyé par kevin39300 par MP
j'ai essayé votre méthode mais,l'image de sortie est blanche avec de l'overflow.
en sortie je souhaite avoir l'image d'entrée( inputImg) avec mon message cacher dans celle si.

avec mon code j’obtiens bien l'image d'entrée mais avec des pixel noir a certain endroit.
Vu que tu n'ajoutes que des 0 et 1, tu ne devrais pas avoir ce problème... tu n'aurais pas inversé les conditions ?
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 21h15   #6
kevin39300
Invité de passage
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2012
Messages : 5
Points : 0
Points : 0
Merci du fond du cœur depuis le temps que je bataille dessus.

mille merci
kevin39300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h27.


 
 
 
 
Partenaires

Hébergement Web