如何使用opencv检测停车标志?

lp0sw83n  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(446)




请注意,我是计算机视觉和opencv(java)的初学者。
我的目标是识别停车标志,并在其周围画出边界框。我的问题是,四个标志从顶部(红色边框)没有确定(见最后一张图片)。我还注意到,canny边缘检测并没有捕捉到这四个标志的边缘(见第二张图)。我尝试了其他的图片,得到了同样的结果。我的方法如下:
加载图像并将其转换为灰度
利用双边滤波和高斯模糊对图像进行预处理
执行canny边缘检测
查找所有轮廓
用弧长计算周长,用approxpolydp近似等高线
如果近似图形有4个点,那么假设它是一个矩形,因此添加轮廓
最后,精确地画出有4个点的等高线。

Mat filtered = new Mat();

    Mat edges = new Mat(src.size(), CvType.CV_8UC1);
    Imgproc.cvtColor(src, edges, Imgproc.COLOR_RGB2GRAY);

    Imgproc.bilateralFilter(edges, filtered, 11, 17, 17);

    org.opencv.core.Size s = new Size(5, 5);
    Imgproc.GaussianBlur(filtered, filtered, s, 0);

    Imgproc.Canny(filtered, filtered, 170, 200);

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Imgproc.findContours(filtered, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

    List<MatOfPoint> rectangleContours = new ArrayList<MatOfPoint>();
    for (MatOfPoint contour : contours) {
        MatOfPoint2f dst = new MatOfPoint2f();
        contour.convertTo(dst, CvType.CV_32F);
        perimeter = Imgproc.arcLength(dst, true);
        approximationAccuracy = 0.02 * perimeter;
        MatOfPoint2f approx = new MatOfPoint2f();

        Imgproc.approxPolyDP(dst, approx, approximationAccuracy, true);
        if (approx.total() == 4) {
            rectangleContours.add(contour);
            Toast.makeText(reactContext.getApplicationContext(), "Rectangle detected" + approx.total(), Toast.LENGTH_SHORT).show();
        }
    }

    Imgproc.drawContours(src, rectangleContours, -1, new Scalar(0, 255, 0), 5);

很高兴得到关于如何解决这个问题的建议,即使这意味着改变我的策略。

7fyelxc5

7fyelxc51#

从ocr、tesseract开始,识别大“p”和其他与停车场相关的文本模式怎么样?
(toast看起来像android:如何在android中使用tesseract?
java通用tesseract:https://www.geeksforgeeks.org/tesseract-ocr-with-java-with-examples/ )
另一个例子,在python中,但是看到了预处理和其他技巧,以及当图像具有渐变、低对比度、小字体等时使字母可识别的想法:如何从pytesseract获得最佳结果?
此外,还可以通过颜色进行过滤,因为标志的颜色是已知的。转换为灰度会删除这些有价值的信息,因此可以找到边缘,但颜色仍然可以使用。e、 g.把颜色分成b,g,r,并把每个通道作为灰度,可能的话可以增强它。红色和蓝色的边框会很醒目。
似乎红色边框周围的对比度太低,蓝色标志比黑色轮廓更亮。如果不分割,在转换为灰度之前,一些颜色通道可以被放大,比如红色通道。
搜索对比度低的黄色/蓝色大区域,找到文本,“p”等。tesseract有一个函数返回找到的文本框。
另外,一旦你在某处找到一个标志或一条标志及其方向,你可以在那里垂直/水平搜索。
你也可以搜索houghlines,也可以找到标志周围的黑色边框。
用弧长计算周长,用approxpolydp近似等高线
如果近似图形有4个点,那么假设它是一个矩形,因此添加轮廓
imo精确地找到4个点(或多边形简化后)是困难的,可能不足以作为证据,如果直接比较轮廓,还会有圆角等。
顶点之间的Angular 和距离很重要-直线是否平行(有一定的精度)等等。
这个过程可以是迭代的:逐渐减少多边形细节,检查面积和周长,直到顶点达到4(或大约4)。如果面积和周长在多边形近似(简化圆角等)后变化不大(必须找到比值),而轮廓中的点数会减少。我也会尝试比较边界框和凸包测量等。

irlmq6kh

irlmq6kh2#

如果只需要检测停车标志,则将此问题视为经典的对象检测问题(就像人脸检测一样)。为了获得最佳效果,您需要使用基于深度学习的卷积神经网络模型。
首先,您可以训练yolo模型,它将为您提供比opencv更好的结果。你至少需要500张图片。然后你需要注解它们。本教程是关于yolo的入门教程。让我们试一试。
像yolo一样,有很多模型,所有的模型都可以使用类似的过程进行训练。所以如果你想在android上部署你的模型,我建议你选择一个基于tensorflow的模型。在你的pc上训练它,并将训练好的序列化模型集成到你的应用程序中。

相关问题