【问题标题】:Write cv::Mat to binary files? [duplicate]将 cv::Mat 写入二进制文件? [复制]
【发布时间】:2015-04-19 02:04:03
【问题描述】:

我正在使用 openCV,并且我有一个 CV_32F 类型的 95,1 mat 对象,我想将其写入二进制文件。我正在使用下面的代码,但是我不能将 32F 转换为 char 类型。有什么建议吗?我还想执行读取二进制文件并将值存储到相同类型的 mat 对象中的相反过程。

try{
    ofstream posBinary;
    posBinary.open("C:/Users/Dr.Mollica/Documents/TSR Datasets/signDatabasePublicFramesOnly/posSamps.bin", ios::out | ios::binary);
    posBinary.write((char *)featureVector, sizeof(featureVector);
}
catch (exception X){ cout << "Error! Could not write Binary file" << endl; }

还要注意,我想在二进制文件中执行此操作的原因是我会将大量这些向量写入文件,该文件将被读入机器学习算法。根据我的理解,读取和写入二进制文件是最快的方式。

【问题讨论】:

    标签: c++ opencv file-io matrix


    【解决方案1】:

    我建议您使用 OpenCV API 将 cv::Mat 写入 xmlyml 文件,稍后您可以轻松地从它们那里读取 cv::Mat

    例如:

    cv::Mat yourMatData;
    
    // write Mat to file
    cv::FileStorage fs("file.yml", cv::FileStorage::WRITE);
    fs << "yourMat" << yourMatData;
    
    // read Mat from file
    cv::FileStorage fs2("file.yml", FileStorage::READ);
    fs2["yourMat"] >> yourMatData;
    

    更新:如果您喜欢将它们写入/读取二进制文件,您可以先将cv::Mat 转换为数组/向量。然后将数组/向量写入文件。

    要继续阅读,请查看Convert Mat to Array/Vector in OpenCV

    【讨论】:

    • 据我了解,使用二进制文件阅读文字会更快。我将有大量这些向量提供给学习算法,所以我想尽可能快地编写和阅读它们。
    • @pdm 我也建议你使用 xml 或 yml。的确,使用二进制文件更快,但 xml 或 yml 对于大多数情况来说已经足够快了。切记不要在 Visual Studio 调试器中测试速度,在调试器中对大文件使用 xml 或 yml 非常非常慢。如果你觉得 xml 或 yml 太大,你可以使用 xml.gz 或 yml.gz,OpenCV 会自动压缩文件。
    • 谢谢,我想我会坚持使用 xml 或 yml 文件,但为了将来的参考,是否可以举例说明如何使用二进制文件完成此操作。再次感谢您的快速回复。
    • @pdm 将cv::Mat 转换为数组/向量后,您可以像往常一样将它们写入文件,例如posBinary.write((float *)yourArray, sizeof(float)*num);
    • @herohuyongtao 只是为了更正阅读它只是 cv::FileStorage fs2("file.yml", FileStorage::READ); fs2["yourMat"] >> yourMatData;
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多