我正在尝试从 calculate_markerVectors
函数返回 vector 并将其复制到 pose
但我一直遇到“vector 下标超出范围”错误。
我可以尝试通过引用返回,但我更想知道我在使用这种函数返回时做错了什么。
返回值由 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;
}
最佳答案
对于这种情况,您应该使用调试器。
我找不到您的代码有任何逻辑错误。但是在使用 vector 时,您应该始终检查是否正在访问超出 vector 大小的索引。
在这种情况下,我会检查 corners.size() > 0
、corners[0].size() >= 2
和 vec_AC.size() >= 1
。执行此操作后,您应该可以保证 pos_img
将被正确填充或根本不会被填充。
接下来,在访问 pose
之前,我会检查是否 pose.size() >= 1
在访问 pose[0]
和姿势[1]
。
正确地进行这些检查将完全避免 vector 下标超出范围错误,并且还将帮助您追查为什么 markerCorners
没有达到您期望的大小。
关于c++ - 从函数返回 vector 给出 "vector subscript out of range"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56794191/