Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Urgent : fonction Clip (inconnue) ou remplacant un round

4 réponses
Avatar
Vaguener Frank
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

4 réponses

Avatar
Fabien LE LEZ
On Fri, 2 Jan 2004 04:07:47 +0100, "Vaguener Frank"
wrote:

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

Avatar
M. B.
Les indices de tableaux commencent a 0 et non a 1
en C et C++

MB

"Vaguener Frank" a écrit dans le message de news:
3ff4e077$0$29010$
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<0;i++)
{for(int j=1;j<0;j++)
{
.....


Avatar
Pierre Maurette
"Vaguener Frank" 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

Avatar
Vaguener Frank
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$

"Vaguener Frank" 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