使用OpenCV实时检测不同形状的交通标志

时间:2018-11-13 11:20:10

标签: python c++ ios opencv vision

我正在尝试创建一个可以检测摄像头交通标志的应用。但是,我在检测标志时遇到了一些困难。

由于交通标志的颜色可能有所不同,所以我希望首先检测出交通标志的形状。

我试图首先找到所有轮廓,然后尝试检测每个轮廓的形状。但是,标志的轮廓不够清晰,树背景包含许多会影响检测的小轮廓。因此程序无法找到交通标志的完整轮廓。我知道从openCV使用fastNlMeansDenoisingColored()可以显着消除噪声并使检测变得更加准确。但这对于实时处理来说太慢了。

我不仅要检查圆形符号,还要检查三角形或四边形符号。因此,我希望首先找到所有物体的轮廓,然后尝试检查物体的形状。

这是我用来在图片内部查找轮廓的代码,它就是结果。我要开发一个iOS应用,所以它在Objective-c中。

- (cv::Mat)findSigns:(cv::Mat)src {
    Mat edge;
    Mat src_gray;
    cvtColor(src, src_gray, COLOR_RGB2GRAY);
    medianBlur(src_gray, src_gray, 5);
    Canny(src_gray, edge, 80, 80, 3);
    Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3));
    Mat dilated;
    cv::dilate(edge, dilated, kernel);
    std::vector<std::vector<cv::Point>> contours;
    std::vector<cv::Vec4i> hierarchy;
    RNG rng(12345);
    cv::findContours(edge, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    Scalar color = Scalar(255, 0, 255);
    for(int i = 0; i<contours.size(); i++){
        std::vector<cv::Point> c = contours[i];
        double area = cv::contourArea(c);
        if (area > 100) {
            drawContours(src, contours, i, color, 2, 8, hierarchy);
        }
    }

    edge.release();
    src_gray.release();
    kernel.release();
    dilated.release();

    return src;
}

src图片:

src picture

result without filtering out the contours with small area

由于轮廓太多,因此我尝试删除面积较小的轮廓。这就是结果。

final result

此外,我还尝试检查是否hierarchy [i] [2] == -1以查看是否存在任何闭合轮廓。但是它们都等于-1。

我可以知道如何检测交通标志的形状吗?我是否应该通过移除绿色对象来移除树背景以便于检测?

1 个答案:

答案 0 :(得分:0)

要正确检测轮廓,需要首先使图像平滑。

请检查链接以供参考。 链接:http://answers.opencv.org/question/164533/how-to-smooth-the-edges-of-a-low-quality-image/