Возвращение вектора из функции выдает ошибку «векторный индекс вне диапазона» - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь вернуть вектор из функции 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 Ответ

1 голос
/ 27 июня 2019

Вы должны использовать отладчик для подобных случаев.

Я не могу найти ничего логически неправильного в вашем коде.Но при использовании векторов вы всегда должны проверять, обращаетесь ли вы к индексу, превышающему размер вектора.

В этом случае я бы проверил, если corners.size() > 0, corners[0].size() >= 2 и vec_AC.size() >= 1.После того, как вы это сделаете, вы должны быть уверены, что pos_img будет заполнен правильно или не заполнен вовсе.

Далее, прежде чем получить доступ к pose, я проверю, есть ли pose.size() >= 1, прежде чем получить доступ к pose[0] иpose[1].

Правильное выполнение этих проверок полностью исключит ошибку векторного индекса вне диапазона, а также поможет вам выяснить, почему markerCorners не имеет ожидаемого размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...