¿Cómo acceder a los elementos por fila, col en la nueva clase "Mat" de OpenCV 2.0? La documentación está vinculada a continuación, pero no he podido encontrarle sentido. http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#matAccediendo a un elemento de matriz en el objeto "Mat" (no el objeto CvMat) en OpenCV C++
Respuesta
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.
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.
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!
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. –
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
- 1. convertido cv :: Mat a const CvMat * o * CvMat
- 2. imprimir los valores de una matriz (MAT) en OpenCV C++
- 3. cómo transformar un cvMat OpenCV de nuevo a ndarray en numpy
- 4. Diferencia entre cvMat, Mat e IpImage
- 5. Concatenate Mat en OpenCV
- 6. almacenar objetos cvMat en una matriz - OpenCV - iPhone
- 7. Convertir matriz NumPy a cvMat cv2
- 8. Cómo convertir GpuMat a CvMat en OpenCV?
- 9. Conversión de opencv de un elemento Mat a IplImage *
- 10. Convertir el bucle de matriz OpenCV a JavaCV
- 11. OpenCV elemento de acceso desde Mat
- 12. Convirtiendo un archivo .mat de MATLAB en una matriz cv :: Mat en OpenCV
- 13. Calcula el área de un objeto con OpenCV
- 14. Devolución del objeto Mat del código nativo a java en OpenCV
- 15. Acceso matriz opencv CV_32S elemento
- 16. Obtener índices no nulas de Mat OpenCV
- 17. OpenCV cv :: Mat 'unos' para matriz multicanal?
- 18. ¿Cómo establecer un píxel a un valor en un objeto cv :: Mat?
- 19. OpenCV 2.3: Convertir Mat a matriz de píxeles RGBA
- 20. Actualización de una submatriz de Mat en OpenCV
- 21. conversión entre matriz OpenCV y matriz int
- 22. Convierte el objeto XmlDocument en un objeto XmlNode - C#?
- 23. NSImage a cv :: Mat y viceversa
- 24. Obtener el índice del objeto en la matriz para buscar el objeto correspondiente en otra matriz
- 25. Accediendo al objeto de formulario en formtastic
- 26. Convertir marco de vista previa de Android a OpenCV Mat
- 27. ASP.NET MVC3: agregar dinámicamente un elemento a la matriz en el objeto
- 28. ¿Cuál es la estructura de memoria de cvMat de OpenCV?
- 29. Cómo mostrar OpenCV Mat en MFC View
- 30. Eliminar columna de OpenCV Mat
¿Cómo se establece un valor particular a algún índice particular de M? – damned
@sumit el método at <>() devuelve una referencia al elemento.Puede usar: M.at (0, 0) = valor; –
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