обнаружение объектов Android OpenCV - PullRequest
5 голосов
/ 16 октября 2011

После съемки с помощью телефона Android я хочу определить объект на картинке, например, щелкнув по нему.Возможные объекты в большинстве случаев:
1. Линейка
2. Лицо
3. Карандаш
Я использую android prebuilt-opencv версии 2.3.1, и я попытался щелкнуть объект линейки и заполнить егочтобы пометить его, но если контуры не закрыты, будет заполнена вся картина.
a) Я также попытался щелкнуть объект линейки и перейти на юг, север, восток, запад, чтобы посмотреть, где находятся края, и собрать эти координаты., но я столкнулся с тяжелыми проблемами там (не спрашивайте).

Вопросы:
1. Можно ли как-то замкнуть контуры, чтобы просто заполнить нужный объект?
2. Что я на самом деле хочу найти, это координаты дна И высота (например) линейка.
ЛЮБЫЕ другие решения приветствуются.Как бы вы поняли это?

Обновление: я исправил проблему с а) и сейчас использую этот подход (не рад этому).Я также попробовал подход Entreco, но, похоже, пока не дал желаемого решения.

1 Ответ

7 голосов
/ 26 октября 2011

Я не знаю, пытались ли вы это сделать, но обычно вы можете добиться лучших результатов, обработав сначала изображение.

1) Примените GuassianBlur , чтобы удалить шум

2) Применить AdaptiveThreshold -> для преобразования изображения в черно-белое

3) Применить операцию Расширить , заполнить трещины

Используя различные настройки для AdaptiveThreshold и операции Dlate, вы можете получить замкнутые контуры ...

Пример, который я использовал, выглядит следующим образом:

// 1) Apply gaussian blur to remove noise
Imgproc.GaussianBlur(mGraySubmat, mIntermediateMat, new Size(11,11), 0);

// 2) AdaptiveThreshold -> classify as either black or white
Imgproc.adaptiveThreshold(mIntermediateMat, mIntermediateMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 2);

// 3) Invert the image -> so most of the image is black
Core.bitwise_not(mIntermediateMat, mIntermediateMat);

// 4) Dilate -> fill the image using the MORPH_DILATE
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size(3,3), new Point(1,1));
Imgproc.dilate(mIntermediateMat, mIntermediateMat, kernel);
...