c++ - كيفية كتابة حصيرة Float إلى ملف في OpenCV




file-io floating-point (3)

لدي مصفوفة

Mat B(480,640,CV_32FC1);

تحتوي على قيم طافية .. أريد كتابة هذه المصفوفة إلى ملف يمكن فتحه في المفكرة أو الكلمة MS أو Excel لرؤية القيم داخل ومن أجل التخزين .... يمكن لوظيفة imwrite أن تحفظ صورة 8 بت أو 16 بت فقط ..

إسقاط اقتراحاتك إذا كان هذا يمكن القيام به؟ إذا نعم ، كيف؟


استخدام كتابة ثنائي:

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

استخدام نداءات OpenCV API الصرفة:

// 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

للحصول على البيانات:

  1. افتح الملف مع أي محرر
  2. ثم قم بمنع كل النص والأرقام باستثناء محتوى علامة البيانات (أي قيم البكسل).
  3. عند الانتهاء ، احفظ ملفك بامتداد txt أو csv وافتحه بـ matlab (أعمال السحب والإفلات).

فويلا. قد تضطر إلى إعادة تشكيل المصفوفة الناتجة في سطر الأوامر Matlab إذا لم تخمن حجم الصورة بشكل صحيح.


يمكنك كتابة cv::Mat إلى ملف نصي باستخدام معالجة ملفات C ++ بسيطة.

هكذا كيف تقوم بها:

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

}




mat