2010-11-17 5 views
1

J'ai donc accéder avec succès des données de pixels dans un cadre à l'aide du C++ emballage d'accès cadre sur la page Web de OpenCVValeurs OpenCV RVB en hexadécimal?

template<class Frame> 
class Frame_Data { 
     IplImage *imgp; 
     public: 
     Frame_Data (IplImage *img=0) {imgp = img;} 
     ~Frame_Data() {imgp = 0;} 
     void operator=(IplImage *img) {imgp=img;} 
     inline Frame* operator[] (int rowIndex) { 
       return ((Frame*)(imgp->imageData + rowIndex*imgp->widthStep)); 
     } 
}; 

typedef struct { 
     unsigned char b,g,r; 
} RgbPixel; 
typedef struct { 
     float b,g,r; 
} RgbPixelFloat; 

typedef Frame_Data<RgbPixel> RgbImage; 

Im puis en utilisant 2 pour les boucles de passer par la matrice de pixels d'image tels que:

for (int i = ymin; i < ymax; i++) 
{ 
    for (int j = xmin; j < xmax; j++) 
    { 
     int r = image[i][j].r; 
     int g = image[i][j].g; 
     int b = image[i][j].b; 

Alors disons que je veux lancer une instruction IF pour vérifier les couleurs des données de pixel. Je l'ai vu quelques sites comme liste les choses comme

image[i][j].r=0xFF; 

or if g < 0x20 

Je ne suis pas utilisé pour les valeurs à la recherche hexagonale, j'ai essayé de les chercher, mais ne trouve pas refernece, im utilisé pour cvscalars, alors qu'est-ce que ces signifier? Comme quoi symbolise 0x20? ou qu'en est-il de 0xFF?

grâce

Répondre

2

La gamme de 0x00 ... 0xFF que vous voyez est un byte qui peut contenir une valeur entre 0 and 255 qui est la façon dont les données de couleur de pixel sont stockées, généralement 3 ou 4 octets se composant de rouge, bleu, vert et facultativement Alpha.

Le CvScalar est juste un contenant pratique de 1, 2, 3 ou 4 doubles qui peut être utilisé pour maintenir ces valeurs sous une forme légèrement différente.

Par exemple:

cv.RGB(1.0, 0.5, 0.3) définit la composante rouge de la couleur à 1.0 or 100%, la composante verte à 0.5 or 50% et la composante bleue à 0.3 or 30%. Lorsque la structure de couleur réelle est créée chacun de ces composants sera constitué d'exactement un byte il en est ainsi analogue à régler la

R (composante rouge) pour 1.0 * 0xFF = 0xFF

G (composante verte) pour 0.5 * 0xFF = 0x7F

B (composante bleue) 0.3 * 0xFF = 0x26

L'alpha est automatiquement réglé sur 1.0 or 0xFF

+0

Je pensais que ce serait facile :) merci buddddy –

0

Hexidecimal est juste un autre représentation d'un nombre (base 16).

Il n'est pas trop difficile de s'y habituer, il vous suffit d'apprendre à convertir vers et depuis les numéros de base 10 habituels. Ouvrez votre calculatrice windows/mac préférée, passez en mode hexadécimal et tapez FF. (le préfixe 0x indique simplement le code que c'est son nombre hexadécimal)

Passez à Dec [imal] et le nombre passera à 255. Tapez 32 dans, en mode décimal, puis cliquez sur hex, vous verrez le changement de nombre à 20 (ou 0x20 comme il est dans votre code)

Maintenant vous pouvez passer de hexadécimal en décimal, vous pouvez passer de décimal à scalaire assez facilement; Juste convertir la gamme;

float Scalar = static_cast<float>(Decimal)/255.f; // 255 being the largest value for your byte-colour

Profitez Hex! Vous constaterez que c'est un moyen très utile, propre et important d'examiner les données.