【问题标题】:JavaCV Warning sign detection?JavaCV警告标志检测?
【发布时间】:2012-08-01 12:00:32
【问题描述】:

我查看了 OpenCV 库的 JavaCV 包装器,我发现可以在 Java 中使用该库在图像上进行人脸检测,但我想知道是否可以使用该库来检测 traffic warning signs on一个图像以及如何?

我在路上拍的照片是这样的:http://www.4shared.com/photo/5QxoVDwd/041.html 并且检测结果应该看起来像这样或类似:http://www.4shared.com/photo/z_pL0lSK/overlay-0.html

编辑: 在我检测到红色后,我得到了这张图片:

我只检测到警告标志三角形形状并忽略所有其他形状时遇到问题。我尝试更改 cvApproxPoly 参数但没有结果。这是我的代码:

public void myFindContour(IplImage image)
{
    IplImage grayImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
    cvCvtColor(image, grayImage, CV_BGR2GRAY);

    CvMemStorage mem;
    CvSeq contours = new CvSeq();
    CvSeq ptr = new CvSeq();
    cvThreshold(grayImage, grayImage, 150, 255, CV_THRESH_BINARY);
    mem = cvCreateMemStorage(0);

    cvFindContours(grayImage, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
    Random rand = new Random();

    while (contours != null && !contours.isNull()) {
        if (contours.elem_size() > 0) {
            CvSeq points = cvApproxPoly(contours, Loader.sizeof(CvContour.class),
                    mem, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0);
            Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
            CvScalar color = CV_RGB( randomColor.getRed(), randomColor.getGreen(), randomColor.getBlue());
            cvDrawContours(image, points, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
        }
        contours = contours.h_next();
    }

    cvSaveImage("myfindcontour.png", image);

}

这是我得到的输出(我对每个形状都使用了不同的颜色,但在最终输出中,我将只使用白色作为检测到的警告标志,其他所有颜色都是黑色):

【问题讨论】:

    标签: java image-processing opencv javacv


    【解决方案1】:

    您必须执行以下操作:

    1. 检测图像上的红色 - 您将获得 1bit 图像,其中:0=非红色,1=红色。
    2. 检测上一步图像中创建的三角形。您可以使用 approxPoly 函数来做到这一点。

    【讨论】:

    • 谢谢,我一定会尝试的。找到this 检测图像颜色的文章。你是这么想的吗?希望我能找到您建议的 approxPoly 函数的内容,因为 JavaCV 的文档并不多。
    • 如何使用 approxPoly 函数检测三角形?
    • 我不认为我可以检查轮廓的边来查看是否有 3 个边,因为三角形的边缘是圆形的。有没有办法将形状检测为三角形,即使是圆形边缘?
    • @ivandj 你读过文档吗?您必须设置这样的参数,该参数将删除轮廓的小边。
    【解决方案2】:

    看,首先找到轮廓区域。 将其与预先计算的值进行比较并将其保持在一个范围内 喜欢

    if(area>Mincontourarea && area<maxcontourare)
    {
    thats it  now we have the signboard do  
    }
    

    如果计算的值不会大于汽车轮廓, 得到轮廓 据我所知你需要 矩算子

    momnts 运算符的代码:

    Moments moment = moments((cv::Mat)contours[index]);
           area = moment.m00;  //m00 gives the area of the detected contour
    

    将上面的代码放在上面讨论的 if 块之前

    如果你想要 x 和 y 坐标再发帖..

    【讨论】:

      【解决方案3】:

      看看我的回答,它是用 c++ 编写的,但是使用 opencv 它能够检测到路标,你可以把它作为一个很好的例子。 https://stackoverflow.com/a/52651521/8035924

      【讨论】:

        猜你喜欢
        • 2021-07-17
        • 2023-04-08
        • 2020-05-06
        • 1970-01-01
        • 2011-11-11
        • 2023-03-29
        • 2013-11-07
        • 1970-01-01
        相关资源
        最近更新 更多