2012-04-02 12 views
14

Estoy buscando una forma eficiente de editar/leer píxeles desde la variable Mat (o Mat3b).¿Cómo se editan/leen los valores de píxel en OpenCv desde la variable Mat?

he utilizado: -

Image.at<Vec3b>(i,j) 

pero parece ser muy lenta.

También utilicé la siguiente: -

A.data[A.channels()*A.cols*i + j + 0] 

pero el problema que estoy enfrentando con esto es cuando corro este bucle

for(i=0; j<A.rows; i++){ 
    for(j=0; j<A.cols; j++){ 
      A.data[A.channels()*A.cols*i + j + 0] = 0; 
      A.data[A.channels()*A.cols*i + j + 1] = 0; 
      A.data[A.channels()*A.cols*i + j + 2] = 0; 
    } 
} 

solamente se ennegrece una parte de la imagen.

+0

hay manera más rápida de acceder a elementos de la estera, como la respuesta aceptada establece correctamente, pero el funcionamiento de su programa en modo de lanzamiento acelerará mucho el tapete .at () accede. Serán un poco más lentos que el acceso al puntero – Sam

Respuesta

18

Here se pueden ver algunas de las posibilidades de acceso rápido elemento.

Pero si quieres hacerlo a tu manera, debes agregar un soporte. De lo contrario, el cálculo de índice no es correcta:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.channels()*(A.cols*i + j) + 0] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 1] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 2] = 0; 
    } 
} 

Pero el diseño de la memoria no se garantiza que sea contigua debido al relleno. Así que de acuerdo a this debe más bien utilizar una fórmula como esta:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.step[0]*i + A.step[1]* j + 0] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 1] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 2] = 0; 
    } 
} 
+0

A.data [A.step [0] * i + A.step [1] * j + 0] = 0; Esta línea me está dando error. –

+2

Utilicé A.data [A.step * i + A.channels() * j + 0], esto funciona bien. Gracias, toma mucho menos tiempo que el método anterior. :) –

14

Esta es una de las formas más eficientes de edición/lectura de píxeles desde cv :: Mat. Crear puntero a una fila (de canal específico si es necesario)

for(int i=0; i<A.rows;i++){ 
    uchar* rowi = A.ptr/*<uchar>*/(i); 
    for(int j=0; j<A.cols; j++){ 
    doProcessOnPixel(rowi[j]); 
    } 
} 
Cuestiones relacionadas