将垫元素 (uchar) 写入.csv

Writing Mat elements (uchar) to .csv

本文关键字:写入 csv uchar 元素      更新时间:2023-10-16

我想将Mat对象(OpenCV uchar)的内容输出到.csv文件中。

现在,我能够编写整数和双精度,甚至(似乎)uchar,但是在Excel中打开csv时,uchar 被解释为字符,因此我无法检查值。所以我试图在将它们保存到 csv 之前将它们转换为字符串,但它失败了。

到目前为止我的代码:

Ofstream Datalogger(path);
// Some code
for (int i = 0; i< vector1.size();i++)
        {
            Datalogger << i << ";"
                << vector1[i].someint << ";"     
                << vector1[i].somedouble << ";" 
            const uchar* Mi = Mat1.ptr<uchar>(i);
            for(int k = 0; k < Mat1.cols; k++)
            {               
                std::string descr( Mi[k]);
                Datalogger << descr << ";" ; 
            }        
            Datalogger << endl;
        }

但错误代码是:

1   IntelliSense: no instance of constructor "std::basic_string<_Elem, _Traits, _Alloc>::basic_string [with _Elem=char, _Traits=std::char_traits<char>, _Alloc=std::allocator<char>]" matches the argument list argument types are: (const uchar)

这可能意味着字符串 descr() 不能接受 uchar。

知道如何将内容记录到 U.csv 并能够看到 uchar 的数值而不是被 Excel 解释为特殊字符吗?

好的,由于实际上不需要字符串,并且只能在Excel中读取数值,因此我只是简单地将转换为整数。

for (int i = 0; i< vector1.size();i++)
        {
            Datalogger << i << ";"
                << vector1[i].someint << ";"     
                << vector1[i].somedouble << ";" 
            const uchar* Mi = Mat1.ptr<uchar>(i);
            for(int k = 0; k < Mat1.cols; k++)
            {               
                int descr = int( Mi[k]);
                Datalogger << descr << ";" ; 
            }        
            Datalogger << endl;
        }

cv::format() 也可能很有用:

cv::Mat M = cv::Mat::ones(3, 3, CV_8UC3);
std::cout << cv::format(M, "csv") << std::endl;

还有一些其他选项可以将垫子打印/格式化到输出:
http://docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html#output-formatting