OpenCV: Acceso y tomando la raíz cuadrada de píxeles
Pregunta
Estoy usando OpenCV para la detección de objetos y una de las operaciones que le gustaría ser capaz de realizar es una raíz cuadrada por píxel. Me imagino que el bucle sería algo como:
IplImage* img_;
...
for (int y = 0; y < img_->height; y++) {
for(int x = 0; x < img_->width; x++) {
// Take pixel square root here
}
}
Mi pregunta es ¿cómo puedo acceder al valor de píxel en las coordenadas (x, y) en un objeto IplImage?
Solución
Suponiendo IMG_ es de tipo IplImage, y suponiendo datos enteros sin signo de 16 bits, diría
unsigned short pixel_value = ((unsigned short *)&(img_->imageData[img_->widthStep * y]))[x];
aquí para IplImage definición.
Otros consejos
OpenCV IplImage es una matriz unidimensional. Debe crear un único índice para llegar a los datos de imagen. La posición de su píxel se basará en la profundidad de color, y el número de canales en su imagen.
// width step
int ws = img_->withStep;
// the number of channels (colors)
int nc = img_->nChannels;
// the depth in bytes of the color
int d = img_->depth&0x0000ffff) >> 3;
// assuming the depth is the size of a short
unsigned short * pixel_value = (img_->imageData)+((y*ws)+(x*nc*d));
// this gives you a pointer to the first color in a pixel
//if your are rolling grayscale just dereference the pointer.
Usted puede escoger un canal (color) moviendo más de píxeles pixel_value puntero ++. Se recomienda usar una tabla de consulta para las raíces cuadradas de píxeles si esto va a ser cualquier tipo de aplicación en tiempo real.
por favor utilice la macro CV_IMAGE_ELEM. También, considerar el uso de cvPow con potencia = 0,5 en lugar de trabajar en pixeles mismo, lo cual se debe evitar de todos modos
Usted puede encontrar varias formas de llegar a elementos de imagen en una bonita OpenCV el tutorial de Gady Agam aquí .