Ошибка Open CV Assertion Failed

В настоящее время я получаю эту ошибку:

Ошибка

OpenCV Error: Assertion failed (0 <= i && i < (int)vv.size()) in getMat_, file 

/tmp/binarydeb/ros-kinetic-opencv3-3.1.0/modules/core/src/matrix.cpp, line 1200

terminate called after throwing an instance of 'cv::Exception'

what():  /tmp/binarydeb/ros-kinetic-opencv3-3.1.0/modules/core/src/matrix.cpp:1200:

error: (-215) 0 <= i && i < (int)vv.size() in function getMat_

Код

В настоящее время я работаю над этим кодом, пытаясь найти круги в видеопотоке, который я получаю от робота. После некоторых умных комментариев я обнаружил, что всякий раз, когда Hough Circles (cv::HoughCircles) обнаруживает круг, я получаю сообщение об ошибке, как указано выше.

cv::Size strel_size;
strel_size.width = 3; 
strel_size.height = 3; 
cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, 
                    strel_size);
cv::morphologyEx(img_bin, intr_ptr, cv::MORPH_OPEN, strel,
        cv::Point(-1,-1), 3);

//cv::medianBlur(intr_ptr, copy_ptr, 7);
cv::bitwise_not(intr_ptr,intr_ptr);
cv::GaussianBlur(intr_ptr, intr_ptr, cv::Size(7,7), 2, 2);
cv::vector< cv::vector<int> > circles;
cv::HoughCircles(intr_ptr, circles, CV_HOUGH_GRADIENT, 1, 70, 140, 15, 20, 
                    400);

for(size_t i = 0; i < circles.size(); i++) {
    cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    int radius = cvRound(circles[i][2]);
    cv::circle(cv_ptr->image, center, 3, cv::Scalar(0,255,0), -1, 8, 0);
    cv::circle(cv_ptr->image, center, radius + 1, cv::Scalar(0,255,0), 
               2, 8, 0);
    ROS_INFO("x: %d, y: %d, r: %d\n", center.x, center.y, radius);
}

//cv::imshow(OPENCV_WINDOW1, cv_ptr->image);
cv::imshow(OPENCV_WINDOW2, cv_ptr->image);
//cv::imshow(OPENCV_WINDOW3, copy_ptr->image);

cv::waitKey(3);

Фон

В настоящее время я пытаюсь создать автономный дрон с помощью ROS на своем Rapsberry Pi, на котором работает Ubuntu MATE 16.04 LTS. Решение проблемы компьютерного зрения с распознаванием красных кругов на данный момент.


person SDG    schedule 30.01.2017    source источник
comment
Индекс где-то за пределами. Согласно отладчику, из какого из операторов в приведенном выше коде исходит это исключение?   -  person Dan Mašek    schedule 31.01.2017


Ответы (1)


Ошибка возникает из-за того, что выходной массив для кругов имеет неправильный формат. Функция cv::HoughCircles принимает резюме: :vector, а не вектор векторов как тип для массива кругов. Также значения являются плавающими, а не целыми.

Сравните руководство на странице http://docs.opencv.org/3.1.0/d4/d70/tutorial_hough_circle.html

(Происходит следующее: когда cv::HoughCircles находит круг, он пытается получить доступ к матрице vec3f, однако в вашем случае это (пустой) cv::vector целых чисел, и, следовательно, утверждение размера не выполняется.)

person dseifert    schedule 31.01.2017
comment
Использование <Vec3f> приводит к ошибке 'Vec3f' was not declared in this scope - person SDG; 31.01.2017
comment
Должен ли я использовать Vec3b? - person SDG; 31.01.2017
comment
Так что, кажется, я понимаю, в чем проблема. Поскольку в новом OpenCV не существует векторов, и он просто использует std::vector class и, как показано, здесь, нам нужно объявить это как cv::Vec3f в случае программного обеспечения, в котором OpenCV подключается. Тем не менее, это правильный ответ, и спасибо! - person SDG; 31.01.2017
comment
Я все еще получаю ошибку OpenCV: утверждение не удалось даже с этим кодом: cv::Vec3f circ; cv::Мат размыт; cv::HoughCircles(размыто, круг, CV_HOUGH_GRADIENT, 1, 20, 50, 30, 0, 0); Любые идеи? - person sqp_125; 04.10.2017
comment
@ sqp_125 попробуйте cv::vector<cv::Vec3f> circ - проверьте учебник, на который я ссылаюсь. - person dseifert; 04.10.2017