2009-12-04 20 views

Respuesta

44

En la documentación:

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat

Dice:

(...) si se conoce el tipo de elemento de matriz , por ejemplo, es flotante, entonces se puede usar en <>() método

Es decir, se puede utilizar:

Mat M(100, 100, CV_64F); 
cout << M.at<double>(0,0); 

tal vez es más fácil de utilizar la clase Mat_. Es un contenedor de plantilla para Mat. Mat_ tiene el operator() sobrecargado para acceder a los elementos.

+0

¿Cómo se establece un valor particular a algún índice particular de M? – damned

+4

@sumit el método at <>() devuelve una referencia al elemento.Puede usar: M.at (0, 0) = valor; –

+1

Estoy bastante seguro de que el ejemplo es que esta respuesta es defectuosa. Creo que hace una conversión insegura internamente, por lo que usar at con double en una matriz uint produciría resultados no deseados/dañados. Sugerir corrección. – Catskul

1

OCV hace todo lo posible para asegurarse de que no puede hacer esto sin conocer el tipo de elemento, pero si desea una forma fácil de codificar pero no muy eficiente para leerlo de manera independiente, puede usar algo como

double val=mean(someMat(Rect(x,y,1,1)))[channel]; 

Para hacerlo bien, usted debe saber el tipo sin embargo. El método <> es la manera segura, pero el acceso directo al puntero de datos generalmente es más rápido si lo haces correctamente.

9

Las ideas proporcionadas arriba son buenas. Para acceder rápidamente (en caso de que quiera hacer una aplicación en tiempo real) puede probar lo siguiente:

//suppose you read an image from a file that is gray scale 
Mat image = imread("Your path", CV_8UC1); 
//...do some processing 
uint8_t *myData = image.data; 
int width = image.cols; 
int height = image.rows; 
int _stride = image.step;//in case cols != strides 
for(int i = 0; i < height; i++) 
{ 
    for(int j = 0; j < width; j++) 
    { 
     uint8_t val = myData[ i * _stride + j]; 
     //do whatever you want with your value 
    } 
} 

acceso puntero es mucho más rápido que el Mat.at <> Acceso. ¡Espero eso ayude!

+1

El costo de acceso del puntero es exactamente igual que Mat.at <> (al compilar en versión). La única diferencia es que afirma, que están activos a menos que el código esté compilado en modo de depuración. –

1

Basado en lo que @J. Calleja dicho, tiene dos opciones

acceso aleatorio

Si desea acceso aleatorio elemento de Mat, simplemente utilizar

at<data_Type>(row_num, col_num) = value; 

El acceso continuo

Si desea un acceso continuo , OpenCV proporciona Mat iterator compatible con el iterador STL

MatIterator_<double> it, end; 
for(it = I.begin<double>(), end = I.end<double>(); it != end; ++it) 
{ 
    //do something here 
} 

o

for(int row = 0; row < mat.rows; ++row) { 
    float* p = mat.ptr(row); //pointer p points to the first place of each row 
    for(int col = 0; col < mat.cols; ++col) { 
     *p++; // operation here 
    } 
} 

tomo prestada la imagen de una entrada de blog en Dynamic Two-dimensioned Arrays in C

enter image description here

Cuestiones relacionadas