C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Urgent : fonction Clip (inconnue) ou remplacant un round

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Vaguener Frank
Guest





PostPosted: Fri Jan 02, 2004 3:07 am    Post subject: Urgent : fonction Clip (inconnue) ou remplacant un round Reply with 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++)
{
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





PostPosted: Fri Jan 02, 2004 3:29 am    Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round Reply with quote



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





PostPosted: Fri Jan 02, 2004 4:29 am    Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round Reply with quote



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





PostPosted: Fri Jan 02, 2004 5:40 am    Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round Reply with quote


"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





PostPosted: Fri Jan 02, 2004 6:55 pm    Post subject: Re: Urgent : fonction Clip (inconnue) ou remplacant un round Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.