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:
- abra el archivo con cualquier editor
- luego suprima todo el texto y los números, excepto el contenido de la etiqueta de datos (es decir, los valores de píxel).
- 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);