JavaCV警告标志检测?

3
我看过JavaCV封装的OpenCV库,发现可以在Java中使用该库对图像进行人脸检测,但我想知道是否可以使用该库在图像上检测交通警示标志,如果可以,如何实现?
我有从路上拍摄的图片,看起来像这样:http://www.4shared.com/photo/5QxoVDwd/041.html 检测结果应该类似于这个或类似于这个:http://www.4shared.com/photo/z_pL0lSK/overlay-0.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个回答

2

你需要完成以下任务:

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

谢谢,我一定会尝试的。我找到了这篇文章,用于检测图像中的颜色。这是你想要的吗?希望我能找到一些关于你建议的approxPoly函数的资料,因为JavaCV的文档不是很多。 - ivandj
如何使用approxPoly函数来检测三角形? - ivandj
我认为我无法检查轮廓的边缘以查看是否有3条边,因为三角形的边缘是圆形的。是否有一种方法仍然可以检测到具有圆形边缘的形状,例如三角形? - ivandj
@ivandj,你看过文档吗?你需要设置这样的参数,可以去除轮廓的小边。 - ArtemStorozhuk

0
看,首先找到轮廓面积。 将其与预先计算的值进行比较,并保持在一个范围内 像这样
if(area>Mincontourarea && area<maxcontourare)
{
thats it  now we have the signboard do  
}

如果计算出的值不会超过汽车轮廓,为了得到轮廓,据我所知,您需要使用矩运算符。

矩运算符的代码:

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

将上述代码放在上面讨论的if块之前。
如果您想要x和y坐标,请再次发布。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接