Как какой-то "праздничный проект", я играю с OpenCV и хочу обнаруживать и измерять вещи.
Текущий рабочий процесс (ранняя стадия - обнаружение):
- Преобразовать в оттенки серого (cv:: cvtColor)
- Применить Адаптивный порог (cv:: adaptiveThreshold)
- Применить canny edge detection (cv:: Canny)
- Поиск контуров (cv:: findContours)
Мой результат немного дерьмовый, и я не уверен, в каком правильном направлении идти. Я уже получил cvBlob, работающий под моей текущей настройкой (OSX 10.7.2, Xcode 4.2.1), это лучший способ пойти? Если да, то как я могу реализовать его правильно?
Или мне нужно сначала вычесть субстраты? Я пробовал это, но после этого не смог найти контуры.
Здесь мое изображение:
И что мой вывод, когда я рисую контуры обратно в первое изображение:
UPDATE
Я заработал в своей программе, и мой результат выглядит немного по-другому...
- (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;
}