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

Posted

技术标签:

【中文标题】使用OpenCV实时检测不同形状的交通标志【英文标题】:Using OpenCV to detect traffic signs in different shapes real time 【发布时间】:2019-04-16 05:18:43 【问题描述】:

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

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

我尝试先找到所有轮廓,然后尝试检测每个轮廓的形状。但是,标志的轮廓不够清晰,并且树背景包含许多会影响检测的小轮廓。使程序无法找到交通标志的完整轮廓。我知道使用 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图片:

由于轮廓太多,所以我尝试去除小面积的轮廓。结果如下。

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

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

【问题讨论】:

你注意到***上有各种各样的问题涵盖了这个确切的主题吗? @Swordfish 是的,我已阅读此页面***.com/questions/32797073/…。有人建议可以使用椭圆检测,但我不仅检测圆形标志。我也希望能检测出三角形或四边形的标志。因此,我希望找到一些方法可以使 findContours 函数变得更加准确。这样,我可以尝试分析轮廓并检查对象的形状。我会尝试阅读有关 *** 的更多问题并找到答案。谢谢。 请不要在问题标题中添加“[已解决]”。请阅读help 了解如何正确处理此问题。 您可以尝试为红色和/或白色设置阈值以检测红色交通标志和蓝色标志。 你可以尝试只使用内部轮廓,因为红色标志周围有一个白色区域 【参考方案1】:

要正确检测轮廓,您需要先对图像进行平滑处理。

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

【讨论】:

我之前在opencv中尝试过不同的模糊功能,但轮廓仍然不正确。此外,我还尝试增加 medianBlur(src, src_copy, ksize) 的 ksize。结果变得更准确,但运行时间太慢。由于我要实时检测标志,所以运行时间不应该那么慢:(

以上是关于使用OpenCV实时检测不同形状的交通标志的主要内容,如果未能解决你的问题,请参考以下文章

教你快速使用OpenCV/Python/dlib进行眨眼检测识别!

opencv 如何检测特定形状的物体

基于计算机视觉的实时摄像头形状距离计算

在 iOS 上使用 OpenCV 检测人脸边缘/形状

使用 OpenCV 检测图像中已知形状/对象的方法

使用OpenCV检测损坏的形状