我使用的代码将点存储到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
答案 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()