2010-11-17 5 views
1

je naviguais sur un code dans la page OpenCV quand il est venu à l'accès Pixel donnéesOpenCV cvSet2d ..... ce que cela fait

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 
CvScalar s; 
s=cvGet2D(img,i,j); // get the (i,j) pixel value 
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); 
s.val[0]=111; 
s.val[1]=111; 
s.val[2]=111; 
cvSet2D(img,i,j,s); // set the (i,j) pixel value 

je l'avais fait quelque chose de semblable, mais j'utilisé la classe modèle fourni pour accéder aux données de pixel ...... de toute façon Im je ne suis pas sûr que je comprends la partie s.val [0] = 111 .... etc? si s.val [0] contient la valeur B, que fait exactement s.val [0] = 111? est-ce qu'il est noir? ... Je ne comprends pas exactement ce que c'est censé être?

Im utilisé pour CVscalars et tels mais je ne comprends pas ce format? Concrètement, que signifie 111?

grâce

Répondre

5

Les fonctions cvSet2D (img, i, j, s) pour ne pas accéder à la (i, j) ième pixel. Il accède au (j, i) ème pixel. C'est parce que les images sont stockées en tant que matrice - vous devez d'abord spécifier la ligne (la coordonnée Y) puis la colonne (la coordonnée X).

Au lieu d'utiliser les fonctions cvGet/Set, avez-vous essayé using pointers to access data within an image?

+0

Bon point, mais je prétendraient que je n'est pas nécessairement défini comme debout pour l'axe X de toute façon .. – ypnos

+0

Mais que signifie le 111? –

+0

C'est la valeur que vous définissez à ce pixel - vous définissez un triplet (s.val [0], s.val [1], s.val [2]) au point (j, i) –

0

Si vous voulez un accès direct aux pixels, après le chargement d'une image que vous pouvez faire quelque chose comme:

// This example converts a colored image to its grayscale version. 
// Let's say that rgb_img is your previously loaded image. 
IplImage* gray_frame = 0; 
gray_frame = cvCreateImage(cvSize(rgb_img->width, rgb_img->height), rgb_img->depth, rgb_img->nChannels); 
if (!gray_frame) 
{ 
    fprintf(stderr, "!!! cvCreateImage failed!\n"); 
    return NULL; 
} 

for (int i = 0; i < rgb_img->width * rgb_img->height * rgb_img->nChannels; i += rgb_img->nChannels) 
{ 
    gray_frame->imageData[i] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //B 
    gray_frame->imageData[i+1] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //G 
    gray_frame->imageData[i+2] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //R 
}