 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Vaguener Frank Guest
|
Posted: Fri Jan 02, 2004 3:07 am Post subject: Urgent : fonction Clip (inconnue) ou remplacant un round |
|
|
Voila, j'ai un problème
J'ai des structures de tableau int de type
struct HSVCameraMatrix
{
int H[120][160],S[120][160],V[120][160];
}
J'effectue la fonction suivante :
for(int i=1;i<=120;i++)
{for(int j=1;j<=160;j++)
{
TableauRgb.H[i][j] = ( (RecordYuv.Y[i][j]) - ( (0.0004258) *
(TableauNormalise.G[i][j]) ) + ( (1.2867842) *
(TableauNormalise.B[i][j]) ) );
TableauRgb.S[i][j] = ( (RecordYuv.Y[i][j]) - ( (0.1213593) *
(TableauNormalise.G[i][j]) ) - ( (0.471690) *
(TableauNormalise.B[i][j]) ) );
TableauRgb.V[i][j] = ( (RecordYuv.Y[i][j]) + ( (1.524764) *
(TableauNormalise.G[i][j]) ) + ( (0.0018702) *
(TableauNormalise.B[i][j]) ) );
D'après ce que j'ai vu sur le net, lors de l'attribution d'une variable
mémoire de type float dans une variable de type int, la partie décimale du
float est généralement tronquée et injectée dans l'entier, mais les
résultats sont faux.
Le code original, sous delphi, qui est exactement le même, donne de bons
résultats, sauf que les lignes de type = ( (RecordYuv.Y[i][j]) - (
(0.0004258) * (TableauNormalise.G[i][j]) ) + ( (1.2867842) *
(TableauNormalise.B[i][j]) ) ); sont précédées de ROUND ( (
(RecordYuv.Y[i][j]) - ( (0.0004258) * (TableauNormalise.G[i][j]) ) + (
(1.2867842) * (TableauNormalise.B[i][j]) ) );
)
Donc, je pense qu'aparemment lors du stockage du résultat du calcul de type
float dans l'int, cela ne marche pas correctement et qu'il ne tronque pas le
truc.
Nous disposons d'un petit dossier résumant le code, de collègues, où nous
avons vu la fonction CLIP ( (RecordYuv.Y[i][j]) - ( (0.0004258) *
(TableauNormalise.G[i][j]) ) + ( (1.2867842) *
(TableauNormalise.B[i][j]) ) ) mais je ne trouve cela nulle part ni en c, ni
dans le code source.
Il y a t-il une fonction qui remplace le ROUND en delphi (arrondi au nombre
supérieur si c'est > .5 ou au nombre inférieur si c'est < au .5) ou quelque
chose du genre compatible C++ toute faite?
Merci d'avance
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Jan 02, 2004 3:29 am Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round |
|
|
On Fri, 2 Jan 2004 04:07:47 +0100, "Vaguener Frank"
<fvaguener (AT) hotmail (DOT) com> wrote:
| Quote: | Donc, je pense qu'aparemment lors du stockage du résultat du calcul de type
float dans l'int, cela ne marche pas correctement et qu'il ne tronque pas le
truc.
|
Essaie un truc du style "floor (n + 0.5)" ou "ceil (n-0.5)"
--
;-)
http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2
|
|
| Back to top |
|
 |
M. B. Guest
|
Posted: Fri Jan 02, 2004 4:29 am Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round |
|
|
Les indices de tableaux commencent a 0 et non a 1
en C et C++
MB
"Vaguener Frank" <fvaguener (AT) hotmail (DOT) com> a écrit dans le message de news:
3ff4e077$0$29010$ba620e4c (AT) news (DOT) skynet.be...
| Quote: | Voila, j'ai un problème
J'ai des structures de tableau int de type
struct HSVCameraMatrix
{
int H[120][160],S[120][160],V[120][160];
}
J'effectue la fonction suivante :
for(int i=1;i<=120;i++)
{for(int j=1;j<=160;j++)
{
.....
|
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Fri Jan 02, 2004 5:40 am Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round |
|
|
"Vaguener Frank" <fvaguener (AT) hotmail (DOT) com> a écrit ..
| Quote: | Voila, j'ai un problème
J'ai des structures de tableau int de type
[...]
chose du genre compatible C++ toute faite?
Merci d'avance
Bonjour, |
Je vais au plus vite puisque vous êtres pressé :
Je suppose que vos valeurs sont positives (ça ressemble à de la
colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en unsigned
int.
(CLIP est peut-être une macro)
En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des
fonctions ceil() et floor() de math.h.
Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76
donnent 1, -1.23 et -1.76 donnent -1).
Le plus simple pour vous est certainement d'ajouter 0.5 au résultat :
TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) *
(TableauNormalise.G[i][j]) ) + ( (0.0018702) *
(TableauNormalise.B[i][j]) ) );
D'après moi, c'est bon comme ça.
Si vous avez des valeurs négatives, vous prenez floor(tout_ça).
Cordialement,
Pierre
|
|
| Back to top |
|
 |
Vaguener Frank Guest
|
Posted: Fri Jan 02, 2004 6:55 pm Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round |
|
|
Exactement, il s'agit d'un espace colométrique...
Un grand merci à tous pour votre support !
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> a écrit
dans le message de news:3ff504d1$0$29081$636a55ce (AT) news (DOT) free.fr...
| Quote: |
"Vaguener Frank" <fvaguener (AT) hotmail (DOT) com> a écrit ..
Voila, j'ai un problème
J'ai des structures de tableau int de type
[...]
chose du genre compatible C++ toute faite?
Merci d'avance
Bonjour,
Je vais au plus vite puisque vous êtres pressé :
Je suppose que vos valeurs sont positives (ça ressemble à de la
colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en
unsigned
int.
(CLIP est peut-être une macro)
En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des
fonctions ceil() et floor() de math.h.
Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76
donnent 1, -1.23 et -1.76 donnent -1).
Le plus simple pour vous est certainement d'ajouter 0.5 au résultat :
TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) *
(TableauNormalise.G[i][j]) ) + ( (0.0018702) *
(TableauNormalise.B[i][j]) ) );
D'après moi, c'est bon comme ça.
Si vous avez des valeurs négatives, vous prenez floor(tout_ça).
Cordialement,
Pierre
|
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|