【问题标题】:Display Values inside Vector<RECT> array在 Vector<RECT> 数组中显示值
【发布时间】:2016-09-30 16:17:36
【问题描述】:

我正在使用将点存储为 Vector 数据类型的代码,如下所示:

    RECT head;
    head.left = pt1.x;
    head.right = pt2.x;
    head.top = pt1.y;
    head.bottom = pt2.y;

    detectBox->push_back(head);

这属于一个函数,该函数具有一个 for 循环,该循环将多个“head”实例存储到detectBox中。这个函数是这样声明的:

void GetHeads(cv::Mat Img, vector<RECT>* detectBox)

其中 Img 只是一个普通的黑白图像,其中包含通过其他过程提取的头部。我现在的问题是如何查看已存储在检测框内的点?我想在 for 循环之外访问它们以用于其他事情。当我尝试打印出变量时,我只能返回地址(0000004FA8F6F31821 等)

另外,detectBox 在代码中是一个灰色阴影(不确定这意味着什么)。

完整的代码可以在我的其他与相同功能相关的问题中找到,这里:

C++ CvSeq Accessing arrays that are stored

-----编辑-----

尝试的方法和相关的错误/输出:

第一:

std::cout << "Back :  " << &detectBox->back << std::endl;

'&':对绑定成员函数表达式的非法操作

第二:

std::cout << "Back :  " << detectBox->back << std::endl;

'std::vector>::back':非标准语法;使用 '&' 创建指向成员的指针

第三:(注意,没有错误,但没有有用的信息输出)

    std::cout << "Detect Box :  " << detectBox << std::endl;

检测框:00000062BF0FF488

第四:

std::cout << "Detect Box :  " << &detectBox[1] << std::endl;

检测框:000000CB75CFF108

【问题讨论】:

  • "打印变量" - 你是如何打印它们的,让我们看看更多的代码。虽然没有看到它,但我猜您正在打印您传入的变量的指针,而不是向量的内容。
  • 灰色阴影 - 可以是任何东西或什么都不是,但通常表示“未使用”。
  • @UKMonkey 通过打印变量,我的意思是我只是想使用“cout”来找出里面存储的内容
  • 但我们不知道您是如何尝试打印它们的 - 鉴于打印出了问题,这是您跳过的问题的一个相当重要的部分。
  • 查看添加的代码链接:)

标签: c++ opencv vector structure push-back


【解决方案1】:

首先,detectBox 是一个指向数组的指针,因此在尝试对其进行索引之前需要对其进行取消引用。

std::cout << (*detectBox)[1];  // Outputs the 2nd RECT in the vector
                               // assuming an operator<< is implemented
                               // for RECT.

在将打印出索引 1 处的第二个 RECT 实例的地址之前包含“&”运算符的地址,您不需要这样做,因为索引运算符为您提供了参考。

std::cout << &(*detectBox)[1];

如果没有操作符

std::cout << "Left: " << (*detectBox)[1].left;
std::cout << "Right: " << (*detectBox)[1].right;
std::cout << "Top: " << (*detectBox)[1].top;
std::cout << "Bottom: " << (*detectBox)[1].bottom;

这可以通过保存对您首先尝试获取的 RECT 的引用然后使用它来改进:

RECT& secondRect = (*detectBox)[1];
std::cout << "Left: " << secondRect.left;
std::cout << "Right: " << secondRect.right;
std::cout << "Top: " << secondRect.top;
std::cout << "Bottom: " << secondRect.bottom;

最后,我注意到你将新的 RECT 推到了 Vector 的背面,但是你总是输出向量中的第二个 RECT。假设您要打印刚刚添加的 RECT,您可以输出 head 局部变量或使用向量上的 back() 方法,如下所示:

RECT& lastRect = detectBox->back();
std::cout << "Left: " << lastRect.left;
std::cout << "Right: " << lastRect.right;
std::cout << "Top: " << lastRect.top;
std::cout << "Bottom: " << lastRect.bottom;

【讨论】:

  • 谢谢,这真的很有帮助。另一方面,我将如何找出有多少不同的元素存储在detectBox 中?我的想法是然后循环并显示里面的所有向量,就像你展示的那样。我尝试使用 sizeof(*detectBox) ,但只得到 32 的答案
【解决方案2】:
detectBox->push_back(head);
std::cout << &detectBox[1];

除非你有一个重载的运算符 "

尝试类似的东西

std::cout << "L: " << &detectBox[1].left << 
             "R: " << &detectBox[1].right << std::endl

我也担心你使用[1] 而你可能想要的是-&gt;back()

【讨论】:

  • 我添加了一些关于我遇到的不同错误的信息。此外,当我按照您的建议使用 .left 和 .right 时,它给出了一个错误,指出............“'left'不是'std::vector的成员,std::分配器<_ty>>'"
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 2017-02-10
  • 2012-06-10
  • 2013-03-19
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多