OpenCV C ++ / Obj-C: Правильное обнаружение объектов

В качестве своего рода «праздничного проекта» я играю с OpenCV и хочу обнаруживать и измерять вещи.

Текущий рабочий процесс (ранняя стадия - обнаружение):

  1. Преобразовать в оттенки серого (cv :: cvtColor)
  2. Применить адаптивный порог (cv :: adaptiveThreshold)
  3. Применить обнаружение хитрых краев (cv :: Canny)
  4. ​​Нахождение контуров (cv :: findContours)

Мой результат довольно дрянный, и я не уверен, в каком правильном направлении двигаться. У меня уже есть cvBlob, работающий под моей текущей настройкой (OSX 10.7.2, Xcode 4.2.1). Это лучший способ? Если да, то как мне это правильно реализовать?

Или мне сначала нужно вычитание фона? Я пробовал это, но потом не смог найти контуры

Вот мое изображение: image to measure

И это мой результат, когда я снова рисую контуры на первом изображении: output

ОБНОВЛЕНИЕ

У меня это работает в моей программе, и мой вывод выглядит немного иначе…

- (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;
}
12
задан Jav_Rock 4 June 2012 в 14:02
поделиться