从函数返回向量给出“向量下标超出范围”错误

时间:2019-06-27 15:18:04

标签: c++ opencv vector

我正在尝试从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;         
}

1 个答案:

答案 0 :(得分:1)

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

我找不到您的代码在逻辑上有问题。但是,在使用向量时,应始终检查是否正在访问超出向量大小的索引。

在这种情况下,我将检查是否corners.size() > 0corners[0].size() >= 2vec_AC.size() >= 1。完成此操作后,应确保pos_img可以正确填充或完全不填充。

接下来,在访问pose之前,我会先检查pose.size() >= 1是否在访问pose[0]pose[1]之前。

正确地进行这些检查将完全避免向量下标超出范围的错误,并且还将帮助您找出markerCorners为何没有您期望的大小的原因。