Bonjour j'ai un script ecrit sur codeblocks l'astuce est simple je dois afficher une image inserer une marque ( le tatouge numérique ) et visionner l'image après insertion de la marque et finalement je dois l'enregistere. tout ceci je l'ai fait le probleme c'est que j'utilise pour l'insertion le scrit de quelqu'un d'autre ( cox & al ) et il utilise l'image comme un vecteur donc je dois convertir l'image en un vecteur . j'ai pu convertir l'image à une matrice mais je n'arrive pas à la convertir en un vecteur ( je vous signal que je suis débutante en C++ et openCV ) donc SVP si quelqu'un peut m aider à trouver le chemin . Merci
#include <iostream>
#include "cv.h"
#include "highgui.h"
//#include "Globale.h"
using namespace std;
/*les deux fonctions qui font la convertion entre la matrice
et l'image */
void mat2image(double **matrice,IplImage *image)
{
CvScalar pixel_val;
int x,y;
for(x=0; x<image->width; x++)
for(y=0; y<image->height; y++)
{
pixel_val = cvGet2D(image,y,x);//toutes les composantes YCrCb
pixel_val.val[0] = matrice[x][y];//Y
cvSet2D(image, y, x,pixel_val);
}
}
void image2mat(IplImage *image, double **matrice)
{
CvScalar pixel_val;
int x, y;
for(x=0; x<image->width; x++)
for(y=0; y<image->height; y++)
{
pixel_val = cvGet2D(image,y,x);
matrice[x][y]=pixel_val.val[0];//Y
}
}
// Debut du programme
int main(int argc, char** argv)
{
// cout << "Hello world!" << endl;
// cout << "Bonjour tout le monde !" << endl;
IplImage *img = cvLoadImage("lena.jpg", 0);// lire l image
int h = img->height;
int w = img->width;
double ** matrice;
matrice = fl_alloc2d(w ,h);
image2mat(img,matrice); // une fonction qui convertit l'iamge en matrice
//ajouter un chiffre à chaque pixel de l'image
//double matrice[600][600];
for (int i=0; i<h; i++)
{
for (int j=0; j<w; j++)
{
matrice[i][j]= matrice[i][j]+20; // le chiffre ajouter ici est 20
// c'est juste un exemple
}
}
/*---------------------------------------------------------------------------------------------------
| normalement au lieu d'avoir une matrice je dois avoir un vecteur donc je dois convertir la matrice |
| en vecteur ensuite appliquer la marque qui est ici un ajout d'un chiffre et ensuite la convertir |
| de nouveau en une matrice :: |
| - convertir matrice en un vecteur :: matrice --> vecteur |
| - appliquer la marque
| - convertir vecteur en matrice :: vecteur-->matrice |
| |
-----------------------------------------------------------------------------------------------------*/
mat2image(matrice,img); // une fonction qui convertit la matrice en image
cvNamedWindow("image", CV_WINDOW_AUTOSIZE); //cree un fentre pour afficher l image
cvShowImage("image", img); // affichage de l image
cvWaitKey(0); // pause en attendant de paC à l etape suivante
cvDestroyWindow("image"); // pour detruire l a le
cvSaveImage("image.bmp",img); // pour enregistrer l'image
cvReleaseImage( &img ); // liberatuion de memoire
return 0;
}
bon si j'utilise le cv::Mat ça convertit une matrice en un vecteur
Pour toi, quelle est la différence entre une matrice et un vecteur ? Pour ma part, d'un point de vue mémoire, la matrice peut parfaitement être représentée par un vecteur. Et donc l'algo qui marche pour un marche pour l'autre (et dans les deux sens).
En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?
bon si j'utilise le cv::Mat ça convertit une matrice en un vecteur
Pour toi, quelle est la différence entre une matrice et un vecteur ? Pour ma part, d'un point de vue mémoire, la matrice peut parfaitement être représentée par un vecteur. Et donc l'algo qui marche pour un marche pour l'autre (et dans les deux sens).
En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?
oui je suis d'accord avec toi qu'une matrice peut etre representé sous forme de vecteur . mais quand je dis matrice c'est comme si j'ai un tableau 2D par contre un vecteru est tout simplement un tableau avec une seule ligne et n colonne
oui je suis d'accord avec toi qu'une matrice peut etre representé sous forme de vecteur . mais quand je dis matrice c'est comme si j'ai un tableau 2D par contre un vecteru est tout simplement un tableau avec une seule ligne et n colonne
Moi en ce qui me concerne une matrice c'est une classe qui en interface publique me propose ceci :
template<class T>
class Matrix{
public :
explicit Matrix(T const& val = T{});
Matrix(uint w, uint h, T const& val = T{});
Matrix(Matrix const&);
Matrix& operator= (Matrix const&);
~Matrix();
//des opérations
//un accès :
T const& operator()(uint x, uint y) const;
T & operator()(uint x, uint y);
private:
//détails d'implémentation dont on se fout
};
Et c'est par quelque chose comme ça que tu devrais passer : à partir de là, tu te fous de savoir si c'est un pointeur de pointeur ou un pointeur simple, ou un vecteur. C'est une matrice.
Et tu n'as pas répondu à la question la plus importante :
Ksass`Peuk a écrit:
En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?
Parce que je ne vois pas quel problème tu peux bien avoir. Si on a pas le prototype de la fonction que tu veux utiliser, on peut difficilement voir de quoi tu as besoin et pourquoi ...
oui je suis d'accord avec toi qu'une matrice peut etre representé sous forme de vecteur . mais quand je dis matrice c'est comme si j'ai un tableau 2D par contre un vecteru est tout simplement un tableau avec une seule ligne et n colonne
Moi en ce qui me concerne une matrice c'est une classe qui en interface publique me propose ceci :
template<class T>
class Matrix{
public :
Matrix();
Matrix(uint w, uint h);
Matrix(Matrix const&);
Matrix& operator= (Matrix const&);
~Matrix();
//des opérations
//un accès :
T const& operator()(uint x, uint y) const;
T & operator()(uint x, uint y);
private:
//détails d'implémentation dont on se fout
};
Et c'est par quelque chose comme ça que tu devrais passer : à partir de là, tu te fous de savoir si c'est un pointeur de pointeur ou un pointeur simple, ou un vecteur. C'est une matrice.
Et tu n'as pas répondu à la question la plus importante :
Ksass`Peuk a écrit:
En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?
Parce que je ne vois pas quel problème tu peux bien avoir. Si on a pas le prototype de la fonction que tu veux utiliser, on peut difficilement voir de quoi tu as besoin et pourquoi ...
- Edité par Ksass`Peuk il y a environ 5 heures
ok voici la fonction que je vais utilisé ( c'est la marque que je dois insere dans l'image )
*--------------------------------------------------------------------------*
| E_BLIND -- embed a watermark by simply adding a message pattern |
| |
| Arguments: |
| c -- image to be watermarked (changed in place) |
| width -- width of img |
| height -- height of img |
| m -- one-bit message to embed |
| alpha -- embedding strength |
| wr -- reference pattern (width x height array of doubles) |
| |
| Return value: |
| none |
*--------------------------------------------------------------------------*/
void E_BLIND( unsigned char *c, int width, int height,
int m, double alpha, double *wr )
{
static double wm[ MAX_IMG_SIZE ]; /* pattern that encodes m */
/* Encode the message in a pattern */
ModulateOneBit( m, wr, wm, width, height );
/* Scale and add pattern to image (with clipping and rounding) */
AddScaledPattern( c, width, height, alpha, wm );
}
/*--------------------------------------------------------------------------*
| ModulateOneBit -- encode a one-bit message by either copying or negating |
| a given reference pattern |
| |
| Arguments: |
| m -- message to be encoded |
| wr -- reference pattern |
| wm -- where to store resulting message pattern |
| width -- width of wm |
| height -- height of wm |
| |
| Return value: |
| none |
*--------------------------------------------------------------------------*/
void ModulateOneBit( int m, double *wr, double *wm, int width, int height )
{
int i; /* index into patterns */
if( m == 0 )
for( i = 0; i < width * height; i = i + 1 )
wm[ i ] = -wr[ i ];
else
for( i = 0; i < width * height; i = i + 1 )
wm[ i ] = wr[ i ];
}
/*--------------------------------------------------------------------------*
| AddScaledPattern -- scale and add a pattern to an image with clipping |
| and rounding |
| |
| This multiplies w by alpha to obtain the added pattern, and adds |
| it to c, clipping and rounding each pixel to an 8-bit integer. |
| |
| Arguments: |
| c -- image to which to add pattern (changed in place) |
| width -- width of image |
| height -- height of image |
| alpha -- scaling factor |
| w -- pattern to scale and add (width times height array of doubles) |
| |
| Return value: |
| none |
*--------------------------------------------------------------------------*/
void AddScaledPattern( unsigned char *c, int width, int height,
double alpha, double *w )
{
int i; /* pixel index */
for( i = 0; i < width * height; i = i + 1 )
c[ i ] = ClipRound( (double)c[ i ] + alpha * w[ i ] );
}
/*--------------------------------------------------------------------------*
| ClipRound -- clip and round a real value to an 8-bit integer |
| |
| Arguments: |
| v -- real value |
| |
| Return value: |
| clipped and rounded value |
*--------------------------------------------------------------------------*/
int ClipRound( double v )
{
int iv; /* clipped and rounded value */
if( v < 0 )
iv = 0;
else if( v > 255 )
iv = 255;
else
iv = (int)floor( v + .5 );
return iv;
}
donc ici le c qui represente l'image est utilisé sous forme de vectuer c'est pour cela que moi je veux convertir la matrice que j'ai en un vecteur .
Génial ... du langage C. Avec des cast complètement laids partout.
Tu as deux choix possibles, tout passer en C ou tout passer en C++ (à noter que globalement tu es plus proche du langage C que du C++ - laaaaaaargement). Fin bon même en C, le code est vraiment pas top.
En gros :
pour tout passer en C, c'est pas trop compliqué : tu vires iostream/"using namespace std;" (que tu as mis alors qu'ils ne sont pas utilisés) et tu vérifies que la fonction fl_alloc_2D est une fonction codée en C (chances très élevées). Ensuite, tu fais un unsigned char* de [w*h] en taille et tu copies la matrice ligne par ligne dedans.
pour tout passer en C++, grosso modo, passer sur cv::Mat et réécrire les fonctions E_BLIND/etc ... pour qu'elles prennent en paramètres des cv::Mat, tout en virant tous les pointeurs moches au passage (pas trop compliqué non-plus).
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C