0

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

RTMotionDetector.h

vector<vector<Point>> *contours; 
    vector<vector<Point>> *contoursPoly; 

RTMotionDetector.cpp

RTMotionDetector::RTMotionDetector(void) 
{ 
    current = new Mat(); 
    currentGrey = new Mat(); 
    canny = new Mat(); 
    next = new Mat(); 
    absolute = new Mat(); 

    cam1 = new VideoCapture(); 
    cam2 = new VideoCapture(); 

    contours = new vector<vector<Point>>(); 
    contoursPoly = new vector<vector<Point>>(); 
    boundRect = new vector<Rect>(); 

} 

double RTMotionDetector::getMSE(Mat I1, Mat I2) 
{ 
    Mat s1; 

    //Find difference 
    cv::absdiff(I1, I2, s1);  // |I1 - I2| 
    imshow("Difference",s1); 

    //Do canny to get edges 
    cv::Canny(s1,*canny,30,30,3); 
    imshow("Canny",*canny); 

    //Find contours 
    findContours(*canny,*contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); 
    //System::Windows::Forms::MessageBox::Show(""+contours->size()); 

    //Draw contours 
    drawContours(*current,*contours,-1,Scalar(0,0,255),2); 
    for(int i=0;i<contours->size();i++) 
    { 
     cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true); 
     //boundRect[i] = boundingRect(contoursPoly[i]); 
    } 
} 

Как только выполняется следующая часть, я получаю сообщение об ошибке

cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true); 

Вот ошибка, которую я получаю.

enter image description here

Если я закомментировать этот кусок кода, то никаких проблем. Я знаю, что это ArrayIndexOutOfBounds вопрос, но я действительно не могу найти исправление. Может быть, потому что я новичок в программировании на Windows.

Очень важно, чтобы contours оставался как указатель вместо локальной переменной, потому что локальная переменная замедлила программу невероятным образом.

Пожалуйста, помогите мне исправить эту проблему. Спасибо.

+3

Я никогда не видел так много «новых' в одном месте. Используйте умные указатели **, если у вас обязательно должны быть указатели **. – chris

+2

Нажмите «Повторить попытку», отлаживая приложение. Скорее всего, вы ничего не заполняете своим вектором. –

+0

@ TheForestAndtheTrees: Я сделал. Ничего не изменилось :( –

ответ

3

Вам нужно найти, какой доступ к которому вектор вышел за пределы его.

Вы петля сезам размер контуров,

for(int i=0;i<contours->size();i++) 

, но затем получить доступ (*contoursPoly)[i]

я догадку, что contoursPoly вышел за ее пределы, которые вы можете проверить, разбив в отладчик как было предложено.

Изменение цикла для

for(int i=0;i<contours->size() && i<contoursPoly->size();i++) 

может решить непосредственную проблему.

+0

Да, правда. Я использовал вашу технику, пока не найду полное исправление. Благодаря :) –

1

Здесь

(*contoursPoly)[i] 

вы пытаетесь получить доступ что-то, что не существует.

Более того, документация говорит:

C++: пустота (кривая InputArray, OutputArray approxCurve, двойной эпсилон, BOOL закрыт) approxPolyDP ... approxCurve - (...) Тип должны соответствовать типу входного кривой (...)

Здесь есть вход - Mat и выходной - вектор < точка>. Возможно, это тоже работает, IDK.

Смежные вопросы