在Vector <rect>数组

时间:2016-09-30 16:17:36

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

我使用的代码将点存储到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只是一个正常的黑白图像,通过其他过程提取的头部进给。我现在的问题是如何看到存储在detectBox中的点?我想在for循环之外访问它们以用于其他事情。当我尝试打印变量时,我只能返回地址(0000004FA8F6F31821等)

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

完整代码可以在我的同一函数的其他问题中找到,在这里:

C++ CvSeq Accessing arrays that are stored

- - - - - - - - 编辑

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

首先:

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

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

第二

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

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

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

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

检测框:00000062BF0FF488

第四:

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

检测框:000000CB75CFF108

2 个答案:

答案 0 :(得分:1)

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

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

包括&#39;&amp;&#39;的地址运算符之前它将打印出索引1处的第二个RECT实例的地址,您不需要这样做,因为索引运算符会为您提供引用。

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

没有运营商&lt;&lt;要将RECT实例输出到流,您需要直接访问成员。以下应该有效:

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;

最后,我注意到你在Vector的背面推动了新的RECT,但是你总是在向量中输出第二个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;

答案 1 :(得分:0)

detectBox->push_back(head);
std::cout << &detectBox[1];

除非你有一个重载的运算符“&lt;&lt;”对于RECT(你可能没有),它会尝试将它与最好的东西相匹配,这显然不会是你想要的。

尝试更像

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

当你可能想要的是[1]时,我也会担心你正在使用->back()