使用 printf 时 vector<Vec3b> 的格式说明符

Posted

技术标签:

【中文标题】使用 printf 时 vector<Vec3b> 的格式说明符【英文标题】:Format specifier for vector<Vec3b> when using printf 【发布时间】:2014-07-01 05:45:04 【问题描述】:

我想获取 buf 中的第二个像素并使用 printf 打印:

vector<Vec3b> buf;
/* code that fills buf , I used push_back */
printf("%WHAT", buf[1])

我可以使用 cout 打印这些值,如下所示:

    LineIterator it(img, Point(1,1), Point(20,20), 8);

    vector<Vec3b> buf;   

    for(int i=0; i<it.count; i++)
    
    buf.push_back( Vec3b(*it) ); /* code that fills buf , I used push_back */
    it++;
    
    cout << Mat(buf[1]) << endl;

但我只想使用 printf 来执行此操作。

cout 语句给了我三个值,每个值对应于 R、G 和 B。

我应该在我的 printf 中为 WHAT 放置什么?即这里的格式说明符是什么?

【问题讨论】:

你想要c方案还是c++方案? @Ben 基本上我想对图像数据进行 FFT。 FFT 例程基于 C,需要一个指针。 参见***.com/questions/12069623/printf-and-custom-class,因为 Vec 没有内置 operator const char *(),所以即使作为 printf 的第一个参数也不能传递它。如果您必须使用 printf(为什么?),您可以从 Vec 继承并提供 operator const char *(),但这与链接问题中讨论的一样非常有限。 @gpuguy,而不是 3rd party fft-lib (in c) ,你可以试试 opencv 的dft。另外,考虑到您的原始图像,这只是灰度问题,对吗? (不是彩色像素) 【参考方案1】:

没有直接的方法可以做到这一点。 opencv中有重载的

您必须手动完成所有操作:

for(size_t i=0; i<buf.size(); i++)

   Vec3b v = buf[i];
   printf("[%d %d %d] ", v[0], v[1], v[2] );

printf("\n");

【讨论】:

【参考方案2】:

您不能像这样将它与 printf 一起使用,因为它不是标准类型。我认为您应该编写一个函数来为您打印这种类型,例如:

void printForMe(vector<Vec3b> buf)

    for (auto &vec : buf)
    
        cout << vec[0] << " " << vec[1] << " " vec[2] << std::endl;
    

然后您还可以编辑格式的显示方式。

如果 OpenCv 的 MatX 类有 operator&lt;&lt; 的重载,这会更容易,但它没有,所以你需要自己做这个。

【讨论】:

以上是关于使用 printf 时 vector<Vec3b> 的格式说明符的主要内容,如果未能解决你的问题,请参考以下文章

Vector的用法

vector<vector<int>>vec1 和 vector<int>vec2[100] 有啥区别? [关闭]

STL之vector4

free():vector <vec4i> c ++的无效指针[关闭]

C++ vector容器的使用

STL之vector3