【问题标题】:Returning vector from function gives "vector subscript out of range" error从函数返回向量给出“向量下标超出范围”错误
【发布时间】:2019-11-09 15:53:02
【问题描述】:

我正在尝试从calculate_markerVectors 函数返回向量并将其复制到pose,但我一直遇到“向量下标超出范围”错误。

我可以尝试通过引用返回,但我宁愿知道我在使用这种函数返回时做错了什么。

返回值由 3 个double 类型元素组成。 以下是部分代码:

cv::Point2d pt(1,1);
bool new_Point = false;

int prog(){
 vector<vector<cv::Point2f>> markerCorners;
 //.....
 if (new_Point == true) {
     vector <double> pose = calculate_markerVectors(markerCorners, pt);  // HERE ERROR OCCURS
     cout << "MARKER POSE" << pose[0] << "," << pose[1] << endl;
  }
 //.....
}

vector <double> calculate_markerVectors(vector<vector<cv::Point2f>> corners, cv::Point2d clickPt)
{

 //some calulation happens here

cv::Point2f S;
S.x = corners[0][2].x - (vec_AC[0] / 2);                
S.y = corners[0][2].y - (vec_AC[1] / 2);
double theta = acos(dot_prod / (scalarSF*scalarST));

vector <double> pos_img;
pos_img.push_back(S.x);
pos_img.push_back(S.y);
pos_img.push_back(theta);

return pos_img;         
}

【问题讨论】:

  • markerCorners 填写是否正确?
  • 您应该尝试使用调试器。 Visual Studio 有一个很棒的调试器。
  • 您在显示的代码中返回向量的方式没有任何问题。代码//some calculation happens here中有返回错误情况吗?
  • @fdan 是的。它有 1 个元素,它是具有 4 个元素的向量。
  • 我会在您访问姿势元素 [0] 和 [1] 之前添加一个长度检查,并尝试确定何时返回的矢量元素太少。

标签: c++ opencv vector


【解决方案1】:

对于这种情况,您应该使用调试器。

我在您的代码中找不到任何逻辑错误。但是在使用向量时,您应该始终检查是否正在访问超出向量大小的索引。

在这种情况下,我会检查是否有corners.size() &gt; 0corners[0].size() &gt;= 2vec_AC.size() &gt;= 1。一旦你这样做了,你应该保证pos_img将被正确填写或根本不填写。

接下来,在访问pose 之前,我会在访问pose[0]pose[1] 之前检查pose.size() &gt;= 1

正确执行这些检查将完全避免向量下标超出范围错误,还可以帮助您追查为什么 markerCorners 没有您期望的大小。

【讨论】:

  • 感谢您的建议。它有助于发现问题。它一直是函数内部向量的大小,而不是返回值。
  • 或者最好不要对始终具有相同大小的数据使用可变长度数据结构。这样一来,这些问题就不会发生。 OpenCV 已准备好所有这些类型供您使用。
  • @Rafael 如果您想关闭已回答的问题,只需选择答案旁边的灰色复选标记以接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多