打开CV断言失败错误

时间:2017-01-30 22:51:41

标签: c++ opencv raspberry-pi ros

我目前收到此错误:

错误

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_

代码

我目前正在处理此代码,试图在我从机器人中获取的视频Feed中找到圆圈。经过一些巧妙的评论,我发现只要 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);

背景

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

1 个答案:

答案 0 :(得分:2)

发生错误是因为圆圈的输出数组没有正确的格式。 cv::HoughCircles函数采用cv :: vector,而不是矢量矢量作为圆数组的类型。值也是浮点数,而不是整数。

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

上的教程

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