2011-10-26 8 views
29

Tal vez no estoy buscando lo suficiente, pero todo parece querer que use una matriz. Por lo tanto, ¿cómo obtengo el valor del canal para un píxel particular para foo si foo es algo así como Mat foo = imread("bar.png")?OpenCV obtiene el valor del canal de píxeles desde la imagen Mat

+0

Tal vez esto le ayudará a: http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=get2d#CvScalar cvGet2D (CvArr const * arr, int idx0, int IDX1) – Adrian

+0

Parece que no me deja publicar el enlace correcto, solo vaya a los métodos Get? D. – Adrian

+0

¿existe un método similar para cv :: Mat en comparación con CvArr *? –

Respuesta

80

Suponiendo que el tipo es CV_8UC3 que podría hacer esto:

for(int i = 0; i < foo.rows; i++) 
{ 
    for(int j = 0; j < foo.cols; j++) 
    { 
     Vec3b bgrPixel = foo.at<Vec3b>(i, j); 

     // do something with BGR values... 
    } 
} 

Here es la documentación para Vec3b. ¡Espero que ayude! Además, no olvides que OpenCV almacena cosas internamente como BGR no RGB.

EDIT:
Por motivos de rendimiento, es posible que desee utilizar el acceso directo a la memoria intermedia de datos con el fin de procesar los valores de píxel:

Aquí es cómo se puede ir sobre esto:

uint8_t* pixelPtr = (uint8_t*)foo.data; 
int cn = foo.channels(); 
Scalar_<uint8_t> bgrPixel; 

for(int i = 0; i < foo.rows; i++) 
{ 
    for(int j = 0; j < foo.cols; j++) 
    { 
     bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B 
     bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G 
     bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R 

     // do something with BGR values... 
    } 
} 

O, alternativamente:

int cn = foo.channels(); 
Scalar_<uint8_t> bgrPixel; 

for(int i = 0; i < foo.rows; i++) 
{ 
    uint8_t* rowPtr = foo.row(i); 
    for(int j = 0; j < foo.cols; j++) 
    { 
     bgrPixel.val[0] = rowPtr[j*cn + 0]; // B 
     bgrPixel.val[1] = rowPtr[j*cn + 1]; // G 
     bgrPixel.val[2] = rowPtr[j*cn + 2]; // R 

     // do something with BGR values... 
    } 
} 
+0

¡Gracias! Esto es exactamente lo que quería. –

+0

No hay problema :) ¡Feliz de ayudar! – mevatron

+0

y ¿qué pasa si mi matriz original es CV_32FC3? – nkint

12

El siguiente código funciona para mí, para acceder y cambiar un valor de píxel.

Para acceder valor de canal de píxel:

for (int i = 0; i < image.cols; i++) { 
    for (int j = 0; j < image.rows; j++) { 
     Vec3b intensity = image.at<Vec3b>(j, i); 
     for(int k = 0; k < image.channels(); k++) { 
      uchar col = intensity.val[k]; 
     } 
    } 
} 

Para cambiar un valor de píxel de un canal:

uchar pixValue; 
for (int i = 0; i < image.cols; i++) { 
    for (int j = 0; j < image.rows; j++) { 
     Vec3b &intensity = image.at<Vec3b>(j, i); 
     for(int k = 0; k < image.channels(); k++) { 
      // calculate pixValue 
      intensity.val[k] = pixValue; 
     } 
    } 
} 

`

Fuente: Accessing pixel value

0

La matriz de píxeles se almacena en el atributo "datos" de cv :: Mat. Supongamos que tenemos una matriz Mat donde cada píxel tiene 3 bytes (CV_8UC3).

Para este ejemplo, dibujemos un píxel ROJO en la posición 100x50.

Mat foo; 
int x=100, y=50; 

Solución 1:

crear una función macro que obtiene el píxel de la matriz.

#define PIXEL(frame, W, x, y) (frame+(y)*3*(W)+(x)*3) 
//... 
unsigned char * p = PIXEL(foo.data, foo.rols, x, y); 
p[0] = 0; // B 
p[1] = 0; // G 
p[2] = 255; // R 

Solución 2:

Get es el píxel utilizando el método de la PTR.

unsigned char * p = foo.ptr(y, x); // Y first, X after 
p[0] = 0; // B 
p[1] = 0; // G 
p[2] = 255; // R 
Cuestiones relacionadas