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?

¿Fue útil?

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í .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top