打开 CV 断言失败错误

Open CV Assertion Failed error

我目前收到此错误:

错误

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);

背景

我目前正在尝试在我的 Rapsberry Pi 上使用 ROS 构建一个自主无人机,它是 运行 一个 Ubuntu MATE 16.04 LTS。目前解决了识别红色圆圈的计算机视觉问题。

错误发生是因为圆圈的输出数组格式不正确。 cv::HoughCircles 函数采用 cv::vector,而不是向量的向量作为圆形数组的类型。此外,这些值是浮点数,而不是整数。

比较教程 http://docs.opencv.org/3.1.0/d4/d70/tutorial_hough_circle.html

(发生的情况是,当 cv::HoughCircles 找到一个圆时,它会尝试访问 vec3f 矩阵 - 但是在您的情况下,这是一个(空)cv::vector 整数,因此 size-assertion 失败。)