【问题标题】:How to print cv::Mat in any of CSV, C, Python, MatLab, NumPy styles format如何以任何 CSV、C、Python、MatLab、NumPy 样式格式打印 cv::Mat
【发布时间】:2013-06-11 09:31:20
【问题描述】:

我有一个 OpenCV 矩阵。我想以问题中提到的任何样式打印它。

cv::Mat1b image = cv::imread(input_name, cv::IMREAD_GRAYSCALE);
std::cout << format_in_c_style(image);

有什么想法吗?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    除了显式创建cv::Formatter外,还可以使用cv::format(),可以直接和std::cout一起使用,而且短一点:

    cv::Mat image;    //Loaded from somewhere
    std::cout << cv::format(image, "numpy") << std::endl;
    

    cv::format() 的第二个参数是brotherofken 的答案中提到的任何字符串。

    在 OpenCV 版本 3 中,format() 不再接受字符串,而是枚举。枚举常量对应允许的字符串值,如下:

    FMT_DEFAULT
    FMT_MATLAB
    FMT_CSV
    FMT_PYTHON
    FMT_NUMPY
    FMT_C
    

    调用与上面类似:

    std::cout << cv::format(image, cv::Formatter::FMT_NUMPY) << std::endl;
    

    【讨论】:

    • 谢谢!我认为打印数据更方便。
    【解决方案2】:

    您可以为此目的使用未记录的cv::Formatter 类。请参见下面的示例:

    cv::Mat1b const image = cv::imread(m_cl_parameters.input_name, cv::IMREAD_GRAYSCALE);
    
    cv::Formatter const * c_formatter(cv::Formatter::get("CSV"));
    
    c_formatter->write(std::cout, image);
    

    您不应在使用后销毁从cv::Formatter::get(...) 获得的cv::Formatter 对象。

    函数cv::Formatter::get(const char* fmt)可以处理以下格式:

    “MATLAB”

    输出示例:

    [120, 195, 226;
     142, 138, 78;
     195, 142, 226]
    

    "CSV" - 逗号分隔值。

    输出示例:

    120, 195, 226
    142, 138, 78
    195, 142, 226
    

    “Python”

    输出示例:

    [[120, 195, 226],
     [142, 138, 78],
     [195, 142, 226]]
    

    “NUMPY”

    输出示例:

    array([[120, 195, 226],
           [142, 138, 78],
           [195, 142, 226]], type='uint8')
    

    "C" - 生成 c 风格的数组

    输出示例:

    {120, 195, 226, 142, 138, 78, 195, 142, 226}
    

    【讨论】:

    • 同一个人同时提问和回答 ;-) 感谢您的提示 btw.. +1
    • 这是 StackOverflow 上的标准选项。 “发布您的问题”按钮下方有“回答您自己的问题”复选框。这只是分享知识的方式之一。谢谢:-)
    猜你喜欢
    • 2017-05-28
    • 2018-01-19
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    相关资源
    最近更新 更多