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
Respuesta
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...
}
}
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
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
- 1. OpenCV: ¿obtiene el valor del acumulador Hough?
- 2. OpenCV 2.3: Convertir Mat a matriz de píxeles RGBA
- 3. OpenCV elemento de acceso desde Mat
- 4. Cómo calcular el valor máximo de píxeles de Mat en OpenCV
- 5. OpenCV Mat CV_32FC1
- 6. OpenCV: configuración de todos los píxeles del valor de BGR específico en otro valor de BGR
- 7. Concatenate Mat en OpenCV
- 8. Eliminar columna de OpenCV Mat
- 9. Acceso a cada canal por separado en OpenCV
- 10. ¿Cómo se editan/leen los valores de píxel en OpenCv desde la variable Mat?
- 11. ¿Cómo encontrar el valor de transparencia del canal alfa de un píxel en una imagen png?
- 12. OpenCV cv :: Mat 'unos' para matriz multicanal?
- 13. Convertir la textura OpenGL a OpenCV Mat
- 14. OpenCV dibujar una imagen sobre otra imagen
- 15. Determinación del tipo de plantilla cuando se accede a los elementos OpenCV Mat
- 16. Eliminación de píxeles ruidosos usando opencv
- 17. datos de conversión de glReadPixels() para OpenCV :: Mat
- 18. Obtener índices no nulas de Mat OpenCV
- 19. Ciclo a través de píxeles con opencv
- 20. extrae una imagen de canal de una imagen RGB con opencV
- 21. ¿Obtiene el valor del boundfield oculto? ASP.NET
- 22. Contar píxeles 'blancos' en la imagen binaria de opencv (de manera eficiente)
- 23. Cómo mostrar OpenCV Mat en MFC View
- 24. ¿Tratar con píxeles en contornos (OpenCV)?
- 25. Convertir marco de vista previa de Android a OpenCV Mat
- 26. OpenCV: IplImage versus Mat, ¿cuál usar?
- 27. Devolución del objeto Mat del código nativo a java en OpenCV
- 28. Android obtiene una ruta a la imagen desde la miniatura?
- 29. OpenCV: Obteniendo el total de los valores Mat
- 30. Selección de los píxeles con la mayor intensidad en OpenCV
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
Parece que no me deja publicar el enlace correcto, solo vaya a los métodos Get? D. – Adrian
¿existe un método similar para cv :: Mat en comparación con CvArr *? –