JavaCV警告标志检测?

时间:2012-08-03 12:24:40

标签: java image-processing opencv javacv

我看过OpenCV库的JavaCV包装器,我看到可以在Java中使用该库对图像进行面部检测,但我想知道是否可以使用该库来检测{{3}在图像上以及如何?

我拍摄的照片看起来像这样:traffic warning signs 并且检测结果应该看起来像这样或类似:http://www.4shared.com/photo/5QxoVDwd/041.html

修改 检测到红色后,我得到了这张图片:

enter image description here

我在检测警告标志三角形形状时遇到问题,并忽略所有其他形状。我尝试更改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);

}

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

enter image description here

3 个答案:

答案 0 :(得分:2)

您必须执行以下操作:

  1. 检测图像上的红色 - 您将获得 1位图像,其中: 0 =非红色, 1 =红色。
  2. 检测上一步图像中创建的三角形。您可以使用approxPoly函数来执行此操作。

答案 1 :(得分:0)

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

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

如果计算的值不会大于汽车, 得到contoutr 据我所知,你需要 时刻算子

妈妈运营商的代码:

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

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

如果你想让x和y坐标再次贴一个帖子..

答案 2 :(得分:0)

看看我的答案,它是c ++,但是使用opencv可以检测道路标志,您可以将其作为一个很好的例子。 https://stackoverflow.com/a/52651521/8035924