values read imwrite c++ opencv file-io floating-point mat

c++ - read - pixel opencv python



Cómo escribir una estera flotante en un archivo en OpenCV (4)

Escribí este código:

#include "opencv2/opencv.hpp" using namespace cv; using namespace std; /* Will save in the file: cols/n rows/n elemSize/n type/n DATA */ void serializeMatbin(cv::Mat& mat, std::string filename){ if (!mat.isContinuous()) { std::cout << "Not implemented yet" << std::endl; exit(1); } int elemSizeInBytes = (int)mat.elemSize(); int elemType = (int)mat.type(); int dataSize = (int)(mat.cols * mat.rows * mat.elemSize()); FILE* FP = fopen(filename.c_str(), "wb"); int sizeImg[4] = {mat.cols, mat.rows, elemSizeInBytes, elemType }; fwrite(/* buffer */ sizeImg, /* how many elements */ 4, /* size of each element */ sizeof(int), /* file */ FP); fwrite(mat.data, mat.cols * mat.rows, elemSizeInBytes, FP); fclose(FP); } cv::Mat deserializeMatbin(std::string filename){ FILE* fp = fopen(filename.c_str(), "rb"); int header[4]; fread(header, sizeof(int), 4, fp); int cols = header[0]; int rows = header[1]; int elemSizeInBytes = header[2]; int elemType = header[3]; //std::cout << "rows="<<rows<<" cols="<<cols<<" elemSizeInBytes=" << elemSizeInBytes << std::endl; cv::Mat outputMat = cv::Mat::ones(rows, cols, elemType); size_t result = fread(outputMat.data, elemSizeInBytes, (size_t)(cols * rows), fp); if (result != (size_t)(cols * rows)) { fputs ("Reading error", stderr); } std::cout << ((float*)outputMat.data)[200] << std::endl; fclose(fp); return outputMat; } void testSerializeMatbin(){ cv::Mat a = cv::Mat::ones(/*cols*/ 10, /* rows */ 5, CV_32F) * -2; std::string filename = "test.matbin"; serializeMatbin(a, filename); cv::Mat b = deserializeMatbin(filename); std::cout << "Rows: " << b.rows << " Cols: " << b.cols << " type: " << b.type()<< std::endl; }

Tengo una matriz

Mat B(480,640,CV_32FC1);

que contiene valores flotantes ... Quiero escribir esta matriz en un archivo que podría abrirse en el bloc de notas o en la palabra Ms o Excel para ver los valores dentro y para el almacenamiento .... la función de escritura puede guardar solo imágenes de 8 bits o 16 bits ..

Suelta tus sugerencias si esto podría hacerse? si es así, ¿cómo?


Puede escribir cv::Mat en un archivo de texto usando el manejo simple de archivos C ++.

Aquí sabrás como podrás hacerlo:

#include <iostream> #include <fstream> using namespace std; void writeMatToFile(cv::Mat& m, const char* filename) { ofstream fout(filename); if(!fout) { cout<<"File Not Opened"<<endl; return; } for(int i=0; i<m.rows; i++) { for(int j=0; j<m.cols; j++) { fout<<m.at<float>(i,j)<<"/t"; } fout<<endl; } fout.close(); } int main() { cv::Mat m = cv::Mat::eye(5,5,CV_32FC1); const char* filename = "output.txt"; writeMatToFile(m,filename); }


Usando llamadas de API pura de OpenCV:

// Declare what you need cv::FileStorage file("some_name.ext", cv::FileStorage::WRITE); cv::Mat someMatrixOfAnyType; // Write to file! file << someMatrixOfAnyType;

La extensión del archivo puede ser xml o yml . En ambos casos, obtiene un pequeño encabezado que puede eliminar / analizar fácilmente, luego tiene acceso a los datos en un formato de coma flotante. Utilicé este enfoque con éxito (con archivos yml) para obtener datos en Matlab y Matplotlib

Para obtener los datos:

  1. abra el archivo con cualquier editor
  2. luego suprima todo el texto y los números, excepto el contenido de la etiqueta de datos (es decir, los valores de píxel).
  3. Cuando termine, guarde su archivo con una extensión txt o csv y ábralo con matlab (trabajos de arrastrar y soltar).

Voilà. Es posible que deba remodelar la matriz resultante en la línea de comandos de matlab si no adivinó correctamente el tamaño de la imagen.


use escribir binario:

FILE* FP = fopen("D.bin","wb"); int sizeImg[2] = { D.cols , D.rows }; fwrite(sizeImg, 2, sizeof(int), FP); fwrite(D.data, D.cols * D.rows, sizeof(float), FP); fclose(FP);

entonces puedes leer en el tamaño de lectura de Matlab y luego cambiar la forma (tipo = simple)

fp=fopen(fname); data=fread(fp,2,''int''); width = data(1); height = data(2); B = fread(fp,Inf,type); imageOut = reshape(B,[width,height])''; fclose(fp);