Ответ 1
Да, это возможно. То, что вы описываете, имеет вокруг него всю отрасль, называемую Фотограмметрия
Heyguys.. Это точно не вопрос программирования. Я просто хочу знать, каким будет ваш подход к общей проблеме обработки цифровых изображений.
Предположим, что у вас есть изображение нескольких деревьев в формате jpg. Как бы вы хотели найти высоты каждого из этих деревьев. Фотография - единственный вход, который у вас есть.
Я хочу знать подходы, которые вы не кодируете. Так что это не имеет значения, если ваши ответы расплывчаты или не DIP-ish.
Небольшая коррекция: Высота не должна быть фактической высотой дерева. Высота может быть поднята до любого масштаба. Но должен быть согласован со всеми объектами на рис.
Да, это возможно. То, что вы описываете, имеет вокруг него всю отрасль, называемую Фотограмметрия
В этой области существует достаточное количество исследований в области компьютерного зрения. Предполагая, что вы не знаете ограничений камеры, вам нужно будет сделать предположения о сцене и камере, чтобы определить высоты до масштабного коэффициента. Обратите внимание, что без ограничений камеры или эталонной высоты в изображении невозможно отличить высокое дерево сфотографирован с расстояния или короткого дерева сфотографировали близко. Отличное начало - это Single View Metrology от Criminisi.
Проще всего найти размер объекта из изображений с помощью Photogrammetry. Фотограмметрия - это наука делать измерения с фотографий. Для этого нам нужно знать две вещи:
Ниже приведены шаги:
Калибровка камеры
Используйте openCV для калибровки камеры. Для создания калибровочной матрицы вы можете использовать инструмент OpenCV calibrate.py и шаблон PNG Chessboard, который предоставляется в исходном коде. Калибровка камеры выполняется, чтобы найти параметры камеры. Я взял около десятка фотографий фотографий шахматной доски со многих сторон, как мог, с помощью моей веб-камеры (для калибровки моей веб-камеры). Для более подробной информации проверьте калибровку камеры openCV.
Мы получим f_x, f_y, c_x, c_y из калибровочной матрицы.
Проверяя сведения о сделанных вами фотографиях, вы найдете собственное разрешение фотографий (heightXwidth) и в своих EXIF-заголовках вы может найти значение фокусного расстояния (f). Эти элементы могут различаться в зависимости от вашей камеры.
Пиксели на миллиметр
Нам нужно знать пиксели на миллиметр (пикселей/мм) на датчике изображения.
f_x = F * M_X
f_y = F * M_Y
Так как у нас есть две переменные для каждой формулы, мы можем решить для m_x и m_y.I только усредненные f_x и f_y для получения f_xy.
т = f_xy/focal_length_of_camera
Вставить изображение
Вставьте свое изображение, с которого вам нужно найти фактический размер изображения. Вы должны знать расстояние между объектом и камерой. Найдите размер изображения (height1Xwidth1)
Найти размер объекта в пикселях
Определить размер объекта в пикселях. Я просто использую формулу расстояния, чтобы найти длину выбранной линии. Вы можете принять любой другой метод.
Преобразование px/mm в нижнем разрешении
pxpermm_in_lower_resolution = (width1 * m)/width
Размер объекта в датчике изображения
size_of_object_in_image_sensor = object_size_in_pixels/(pxpermm_in_lower_resolution)
Фактический размер объекта
Фактический размер объекта можно найти с указанными выше данными, так как
real_size = (dist * size_of_object_in_image_sensor)/focal_length
Предполагая, что они находятся на одинаковом расстоянии, все в масштабе, вы бы хотели найти одну единицу измерения, которую вы можете гарантировать. Например, если у вас есть фотография на фотографии, опять же, в том же масштабе, и вы знаете, что они ровно 6 футов в высоту, вы используете это как свою меру. Затем вы берете это и подсчитываете, сколько укладывается в стеке. Например, если вам нужно 3.5 этого человека, то:
3.5 * 6 = 21
дает вам дерево длиной 21 фут.
Без единой точки отсчета для всего, или если все они в разных масштабах, вам понадобится гораздо больше информации, чем вы могли бы легко получить, не будучи там.
Я полагался бы на объект известных измерений, который должен присутствовать на картинке. Например, человек.
Или, может быть, мы могли бы использовать данные EXIF для реверсирования размера объекта на основе размеров датчика камеры, используемого объектива и фокусного расстояния. Это снова зависит от угла. Мы должны получать наиболее точные результаты, когда камера удерживается перпендикулярно объекту.
Если ваше изображение 3 * 3, и вы хотите узнать размер изображения (т.е. 3x3..so 3x3 = 9), теперь у нас есть 8 пикселей, начиная с 0 до 8. Итак, 9/8 = (___) кб.
Если вы хотите найти размер изображения в МБ, как и в примере выше, просто сделайте так (9/8)/(1024) = (----) MB..
Итак, вы получите результат в Mb.