c++ - 从函数返回 vector 给出 "vector subscript out of range"错误

标签 c++ opencv vector

我正在尝试从 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() > 0corners[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/

相关文章:

c++ - 将 <vector <vector<DataClass>> 解除分配为类成员

c++ - 为什么 GCC 6 假设数据是 16 字节对齐的?

c++ - 试图理解适用于我的代码的 Demeter 法则

c++ - 使用 OpenCV 为 OpenGL 加载纹理

OpenCV Yolo V3 微型

performance - Haskell - 从 List 转换为 Data.Vector

c++ - 绘制 .wav 文件的波形

c++ - 将 vector <std::unique_ptr<A>> 转换为 vector <A>

multithreading - 多线程人脸检测停止工作

r - 如何索引R矩阵而不将其恢复为向量