我正在尝试从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;
}
答案 0 :(得分:1)
对于这种情况,您应该使用调试器。
我找不到您的代码在逻辑上有问题。但是,在使用向量时,应始终检查是否正在访问超出向量大小的索引。
在这种情况下,我将检查是否corners.size() > 0
,corners[0].size() >= 2
和vec_AC.size() >= 1
。完成此操作后,应确保pos_img
可以正确填充或完全不填充。
接下来,在访问pose
之前,我会先检查pose.size() >= 1
是否在访问pose[0]
和pose[1]
之前。
正确地进行这些检查将完全避免向量下标超出范围的错误,并且还将帮助您找出markerCorners
为何没有您期望的大小的原因。