Измерение объекта по изображению с использованием известного размера объекта

Поэтому мне нужно измерить длину ноги по изображению, полученному обычным пользователем. Это изображение будет содержать ногу с черным носком, монету (или другой объект известного размера) и белую бумагу (например, А4), на которой будут находиться два других объекта. Что у меня уже есть? -Я уже работал с opencv, но только с простыми проектами; -Я уже начал читать некоторые статьи о калибровке камеры ( "Изучение OpenCv"), но все еще не знаю, нужно ли мне идти так далеко.

Сейчас мне нужна некоторая ориентация, потому что я до сих пор не понимаю, правильно ли я иду, чтобы решить эту проблему. У меня есть несколько вопросов: действительно ли мне нужно откалибровать камеру, чтобы получить два или три измерения стопы? Как я могу найти точки интереса, чтобы измерить линию, каждая картинка - это отдельная картина или есть методы, которым нужно следовать?

Ps: извините за мой английский, я действительно должен улучшить его:-/

4 ответа

Решение

Во-первых, некоторые вещи для получения изображения:

  1. Можете ли вы рассчитывать на черный носок и белый фон? Цвета не так важны, как высокий контраст между носком и фоном.
  2. Можете ли вы стандартизировать угол обзора? Глядя прямо вниз на ногу, вы уменьшите искажение перспективы.
  3. Можете ли вы стандартизировать освещение сцены? Это значительно облегчит обработку, описанную ниже.
  4. Наконец, вы получите более точную оценку, если вы увеличите (или расположите камеру ближе), чтобы нога заполнила большую часть кадра изображения.

Анализ. (Обратите внимание, что это обсуждение будет направлено на ваш вопрос определения осей стопы. Для идентификации и анализа монеты будет использоваться аналогичный процесс, но могут возникнуть некоторые различия.)

  1. Следующая задача - выделить интересующую область (ROI). Если ваша камера смотрит вниз на ногу, то ROI может быть ограничен белым прямоугольником. Мой ответ на это сообщение о переполнении стека - хорошее начало для идентификации квадратов / прямоугольников. Какой самый простой * правильный * метод для обнаружения прямоугольников на изображении?
  2. Если нога полностью лежит в белом прямоугольнике, вы можете обрезать изображение до прямоугольника, найденного на шаге № 1. Это ограничит анализ изображения областью внутри белой бумаги.
  3. "Бинаризируйте" изображение с помощью пороговой функции: http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html. Если вы правильно выберете пороговые параметры, вы сможете уменьшить изображение до черной области (пиксели носка) и белых областей (пиксель без носка).
  4. Теперь начинается самое интересное: вы можете попробовать сопоставить контуры, но если бы это была моя проблема, я бы использовал ограничительные рамки для быстрого решения или моменты для более интересного (и, возможно, надежного) решения.
  5. Используйте cvFindContours, чтобы найти контуры черной области (носка): http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html
  6. Используйте cvApproxPoly, чтобы преобразовать контур в многоугольную форму http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html
  7. Для простого решения используйте cvMinRect2, чтобы найти произвольно ориентированную ограничивающую рамку для формы носка. Короткая ось рамки должна соответствовать линии в largura.jpg, а длинная ось рамки должна соответствовать линии в comprimento.jpg. http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html
  8. Если вы хотите большей (возможной) точности, вы можете попробовать cvMoments для вычисления моментов формы. http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html
  9. Используйте cvGetSpatialMoment, чтобы определить оси ноги. Дополнительную информацию о пространственном моменте можно найти здесь: http://en.wikipedia.org/wiki/Image_moments и здесь http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html
  10. С известными осями вы можете повернуть изображение так, чтобы длинная ось была выровнена по оси (то есть по вертикали). Затем вы можете просто посчитать пиксели по горизонтали и вертикали, чтобы получить длину линий. Обратите внимание, что в этом ориентированном на момент процессе есть несколько предположений. Это забавное решение, но оно может не обеспечить больше точности, особенно потому, что точность измерений вашего размера в значительной степени зависит от вопросов позиционирования камеры, которые обсуждались выше.

Наконец, я предоставил ссылки на старый интерфейс C. Вы могли бы взглянуть на новый интерфейс C++ (я просто не удосужился перенести мой код на 2.4)

Антонио Криминиси, вероятно, написал последнее слово на эту тему несколько лет назад. Если у вас есть время, см. Его статью "Метрология единого взгляда" и докторскую диссертацию.

Я не уверен, нужно ли вам создавать это самостоятельно, но нужно ли вам это делать, а не кодировать. Для этого вы можете использовать KLONK Image Measurement. Есть бесплатные и платные версии.

Вам не нужно калибровать камеру, если у вас есть объект известного размера на вашем изображении. Ну... по крайней мере, если ваша камера не слишком искажает, и если вы не ожидаете высококачественных измерений.

Простой подход состоит в том, чтобы обнаружить белый прямоугольник (искаженный в перспективе), сопоставить углы с неискаженным прямоугольником (используя, например, cv::warpPerspective()) и использовать известный размер этого прямоугольника, чтобы определить размер других объектов в картина. Но это работает только для объектов в той же плоскости, что и бумага, желательно не слишком далеко от нее.

Другие вопросы по тегам