OpenCV C ++ / Obj-C: detección adecuada de objetos

Como una especie de "proyecto de vacaciones" estoy jugando con OpenCV y quiero detectar y medir cosas.

Flujo de trabajo actual (etapa inicial - detección):

Convertir a escala de grises (cv :: cvtColor)Aplicar umbral adaptativo (cv :: adaptiveThreshold)Aplicar detección de bordes de canny (cv :: Canny) Encontrar contornos (cv :: findContours)

Mi resultado es un poco horrible y no estoy seguro de cuál es la dirección correcta. Ya tengo cvBlob trabajando en mi configuración actual (OSX 10.7.2, Xcode 4.2.1) ¿es una mejor manera de hacerlo? Si es así, ¿cómo puedo implementarlo de la manera correcta?

¿O necesito primero la resta de fondo? Lo intenté pero no pude encontrar contornos después

Aquí está mi imagen:

Y esa es mi salida, cuando dibujo mis contornos nuevamente en la primera imagen:

ACTUALIZA

Lo hice funcionar en mi programa y mi salida se ve un poco diferente ...

- (IBAction)processImage:(id)sender
{
    cv::Mat forground = [[_inputView image] CVMat];
    cv::Mat result = [self isolateBackground:forground];
    [_outputView setImage:[NSImage imageWithCVMat:result]];
}

- (cv::Mat)isolateBackground:(cv::Mat &)_image
{
    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0;
    cv::cvtColor(_image, _image, CV_RGB2HSV_FULL);
    cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat bgIsolation;
    cv::inRange(_image, cv::Scalar(bl, gl, rl), cv::Scalar(bh, gh, rh), bgIsolation);
    bitwise_not(bgIsolation, bgIsolation);
    erode(bgIsolation, bgIsolation, cv::Mat());
    dilate(bgIsolation, bgIsolation, element);
    return bgIsolation;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta