values c++ opencv getpixel

access pixel values opencv c++



OpenCV obtiene el valor del canal de pĂ­xeles desde la imagen Mat (3)

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") ?


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

Para acceder al valor del 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: acceso al valor de píxel


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:

Crea una función de 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:

Obtenga el píxel usando el método ptr.

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


Suponiendo que el tipo es CV_8UC3, harías 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 está la documentación para Vec3b. ¡Espero que ayude! Además, no olvide que OpenCV almacena cosas internamente como BGR no RGB.

EDITAR:
Por motivos de rendimiento, es posible que desee utilizar el acceso directo al búfer de datos para procesar los valores de píxeles:

Aquí es cómo puedes hacer 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... } }