tutorial para examples descargar c++ opencv

c++ - para - opencv python



Imprima los valores de una matriz(Mat) en OpenCV C++ (4)

Quiero volcar los valores de una matriz en OpenCV a la consola usando 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.

¿Un lector podría publicar (o señalarme a) una pequeña función o fragmento de código que imprima una estera?

Saludos, Aaron

PD: el código que usa la interfaz más nueva de C ++ Mat en lugar de la interfaz anterior de CvMat es preferencial.


¡Creo que usar matrix.at<type>(x,y) no es la mejor manera de iterar a través de un objeto Mat! Si recuerdo correctamente, matrix.at<type>(x,y) repetirá desde el principio de la matriz cada vez que lo llame (aunque podría estar equivocado). Sugeriría 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; }


Si está utilizando opencv3, puede imprimir Mat como el python numpy style :

Mat xTrainData = (Mat_<float>(5,2) << 1, 1, 1, 1, 2, 2, 2, 2, 2, 2); cout << "xTrainData (python) = " << endl << format(xTrainData, Formatter::FMT_PYTHON) << endl << endl;

Como se muestra a continuación, puede ver que es más legible, consulte here para obtener más información.

Pero en la mayoría de los casos, no es necesario generar todos los datos en Mat, puede generar resultados por rango de filas como 0 ~ 2 filas:

#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) { //row: 6, column: 3,unsigned one channel Mat image1(6, 3, CV_8UC1, 5); // output row: 0 ~ 2 cout << "image1 row: 0~2 = "<< endl << " " << image1.rowRange(0, 2) << endl << endl; //row: 8, column: 2,unsigned three channel Mat image2(8, 2, CV_8UC3, Scalar(1, 2, 3)); // output row: 0 ~ 2 cout << "image2 row: 0~2 = "<< endl << " " << image2.rowRange(0, 2) << endl << endl; return 0; }

Salida como abajo:



#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; }