public List<ABObject> findBirds()
    {
        if (_birds != null) return _birds;
        if (_sling == null) return null;
        
        _birds = new LinkedList<ABObject>();
        
        // scan the birds from left to right
        int xMax = -2;
        final int BIRD_DISTANCE = 150;
        for (ConnectedComponent c : _components)
        {
            if (c.getType() > ImageSegmenter.SLING && c.getType() < ImageSegmenter.PIG)
            {
                int bound[] = c.boundingBox();
                
                // exit if next component is far from the last bird detected
                if (bound[2] > _width / 2 || (xMax != -2 && bound[0] - xMax > BIRD_DISTANCE))
                    break;
                
                // add if not overlapping with previous bird
                if ((bound[0] + bound[2]) / 2 > xMax + 1)
                {
                    Circle b = (Circle) c.getBody();
                    _birds.add(b);
                    _draw.add(c);
                    _drawShape.add(b);
                    xMax = bound[2];
                }
            }
        }
        //System.out.println(_birds.size() + " birds found");
        return _birds;
    }