Подтвердить что ты не робот

Как написать Float Mat в файл в OpenCV

У меня есть матрица

Mat B(480,640,CV_32FC1);

содержащий значения с плавающей точкой. Я хочу записать эту матрицу в файл, который можно открыть в блокноте или в Ms word или Excel, чтобы увидеть значения внутри и для хранения.... функция imwrite может сохранить только 8-битное или 16-битное изображение.

Оставьте свои предложения, если это можно сделать? если да, то как?

4b9b3361

Ответ 1

Использование чистых вызовов API OpenCV:

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

// Write to file!
file << someMatrixOfAnyType;

Расширение файла может быть xml или yml. В обоих случаях вы получаете небольшой заголовок, который вы можете легко удалить/проанализировать, тогда у вас есть доступ к данным в формате с плавающей запятой. Я использовал этот подход успешно (с yml файлами), чтобы получить данные в Matlab и Matplotlib

Чтобы получить данные:

  • открыть файл с помощью любого редактора
  • затем подавляет весь текст и цифры, кроме содержимого тега данных (т.е. значения пикселей).
  • Когда закончите, сохраните файл с расширением txt или csv и откройте его с помощью функции matlab (перетаскивание).

Вуаля. Возможно, вам придется изменить полученную матрицу в командной строке matlab, если она не догадалась правильно размер изображения.

Ответ 2

Вы можете написать cv::Mat в текстовый файл, используя простую обработку файлов на С++.

Вот как вы можете это сделать:

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

}

Ответ 3

использовать write binary:

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);

тогда вы можете прочитать в Matlab размер чтения и затем изменить (тип = один)

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);