Ошибка при отладке: ошибка отладочного утверждения: векторный индекс находится вне диапазона - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть работа над кодом для распознавания жеста рукой с использованием функции извлечения Hu Moment, но когда я начинаю отлаживать, появляется уведомление о том, что отладка завершилась ошибкой! Вектор нижний индекс вне диапазона. кто-то сказал мне, что у меня есть ошибка в моем коде, но я все еще не могу понять это. Пожалуйста, помогите мне. Вот аварийный код

//function hand image declare and preprocessing image
//function contour detection
//function bounding box
int main()
{

VideoCapture cap(0); //capture the video from web cam

if (!cap.isOpened())  // if not success, exit program
{
    cout << "Cannot open the web cam" << endl;

}
vector<vector<Point> > MyContours = getTestCases();
string array[] = {"V","W","Y"};
while (1)
{
    Mat imgOriginal;

    bool bSuccess = cap.read(imgOriginal); // read a new frame from video
    if (!bSuccess) //if not success, break loop
    {
        cout << "Cannot read a frame from video stream" << endl;
        break;
    }
    Mat send;
    imgOriginal.copyTo(send);
    vector<Point> present_hand_state = detectHand(send);

    double area = contourArea(present_hand_state, false);
    cout << area << endl;
    int a = matchTheState(present_hand_state, MyContours);

    if (a != 100 & area > 500)
        imshow("ImgOriginal", imgOriginal);

    waitKey(23);
}
}

int matchTheState(vector<Point> present_hand_state, vector<vector<Point > > MyContours)
{
vector<double> array(MyContours.size());
int answer = 0;
for (int i = 0; i < MyContours.size(); i++)
{
    double match_value = cv::matchShapes(MyContours[i], present_hand_state, CV_CONTOURS_MATCH_I2, 0);
    array[i] = match_value;
    if (array[answer] > array[i])
        answer = i;
}
if (array[answer] < 0.9)
    return answer;
else
    return 100;
}

, в то время как содержимое vector<vector<point>> MyContours является объявлением изображения, которое используется в качестве значения сравнения.

vector<Mat> testCases;
vector<vector<Point> > MyContours;
Mat test = imread("D:\KULIAH\TA\database\F1\frame_v_thres.jpg", CV_LOAD_IMAGE_GRAYSCALE);
testCases.push_back(test);//1
test = imread("D:\KULIAH\TA\database\F1\frame_w_thres.jpg", CV_LOAD_IMAGE_GRAYSCALE);
testCases.push_back(test);//2
test = imread("D:\KULIAH\TA\database\F1\frame_y_thres", CV_LOAD_IMAGE_GRAYSCALE);
testCases.push_back(test);//3

1 Ответ

0 голосов
/ 28 апреля 2020

Единственное, что выпрыгивает из меня, это то, что если MyContours.size() равно нулю, то if (array[answer] < 0.9) будет индексом ошибки вне диапазона. Вы можете проверить это, изменив код на

if (!array.empty() && array[answer] < 0.9)

Но это только теория, здесь слишком много неизвестных, чтобы быть уверенными.

...