2011-11-01 91 views
46

Quiero volcar los valores de una matriz en OpenCV a la consola utilizando cout. Aprendí rápidamente que no entiendo el sistema de tipos de OpenvCV ni las plantillas C++ lo suficientemente bien como para llevar a cabo esta sencilla tarea.imprimir los valores de una matriz (MAT) en OpenCV C++

¿Un lector por favor puesto (o punto de que yo) un poco de función o fragmento de código que imprime un Mat?

Saludos, Aaron

PS: código que utiliza la interfaz de C++ Mat más reciente en lugar de la interfaz CvMat mayores es preferencial.

Respuesta

68

Ver la primera respuesta a Accesing a matrix element in the "Mat" object (not the CvMat object) in OpenCV C++
A continuación, sólo un bucle sobre todos los elementos en cout << M.at<double>(0,0); en lugar de sólo 0,0

O mejor aún con los new C++ interface (gracias a SSteve)

cv::Mat M; 

cout << "M = "<< endl << " " << M << endl << endl; 
+1

Véase también [esta sección del tutorial] (http://opencv.itseez.com/doc/tutorials/core/mat%20-%20the%20basic%20image%20container /mat%20-%20the%20basic%20image%20container.html#print-out-formatting) – SSteve

+1

Brillante. Debería haber metido un tapete para avisar en primer lugar solo para ver si alguien había implementado <<. Un poco más de experimentación y confianza me habrían pagado. – ahoffer

+0

Acabo de hacer una [pregunta sobre esto] (http://stackoverflow.com/questions/10011797/opencv-2-1-where-is-ostream-operator-for-cvmat). ¿Está disponible el operador ostream << en 2.1 y dónde está documentado esto? – juanchopanza

3
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 

#include <iostream> 
#include <iomanip> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    double data[4] = {-0.0000000077898273846583732, -0.03749374753019832, -0.0374787251930463, -0.000000000077893623846343843}; 
    Mat src = Mat(1, 4, CV_64F, &data); 
    for(int i=0; i<4; i++) 
     cout << setprecision(3) << src.at<double>(0,i) << endl; 

    return 0; 
} 
3

creo que el uso de la matrix.at<type>(x,y) no es la mejor manera de recorrer un objeto Trough Mat! Si recuerdo correctamente, matrix.at<type>(x,y) iterará desde el principio de la matriz cada vez que la llame (aunque podría estar equivocado). se recomienda usar cv::MatIterator_

cv::Mat someMat(1, 4, CV_64F, &someData);; 
cv::MatIterator_<double> _it = someMat.begin<double>(); 
for(;_it!=someMat.end<double>(); _it++){ 
    std::cout << *_it << std::endl; 
} 
Cuestiones relacionadas