#algorithm #image #math #image-processing #camera
Вопрос:
У меня небольшая проблема, может быть, кто-нибудь здесь сможет мне помочь.
Я использую камеру для измерения человеческого манекена. Изображение с камеры содержит прямоугольник, в котором должен располагаться манекен.
Определение размера прямоугольника не составляет проблемы, так как известен размер манекена, расстояние до камеры и фокусное расстояние. ( pixelsize = (size*focallength)/distance )
Проблема возникает при измерении с разной высотой камеры. Если камера установлена выше, положение манекена на снимке опускается. Похоже, что предыдущая упомянутая формула здесь не может быть использована, я получаю ложные результаты.
Я попытался измерить различия для разных высот камеры и выяснил, что ее изменения нелинейны.
Поэтому мой вопрос в том, есть ли способ или формула для определения смещения положения манекена на снимке в зависимости от высоты камеры. Я уже искал решения, но не нашел ничего конкретного. Заранее благодарю вас!
Комментарии:
1. Вы можете проверить наличие искажений объектива, рассчитав и применив матрицу гомографии. Кроме того, если вы знаете высоту своей камеры и расстояние до цели… все должно быть довольно линейным.
2. @SneakyPolarBear Гомография вызвана не искажением, а эффектом нормальной перспективы.
3. Если ваша камера остается в вертикальном положении, видимый размер не меняется. Поэтому, предположительно, вы наклоняете его, и прямоугольник превращается в трапецию. Вы должны прибегнуть к уравнениям перспективной проекции.
4. Все эффекты перспективы должны быть линейными, искажение объектива-единственное, что может вызвать нелинейные проблемы
5. @Okayyo как сказал Ив, вам придется наклонить камеру и подвести ее намного ближе к манекену, посмотрите рисунок в моем ответе ниже .
Ответ №1:
как вы видите на изображении выше:
- когда вы поднимаете камеру выше, вам нужно наклонить ее под углом (фиолетовый угол) и приблизиться, чтобы манекен поместился внутри прямоугольника (красный прямоугольник).
- в этом случае, когда вы используете свою формулу
( pixelsize = (size*focallength)/distance )
, вы получите длину оранжевой линии, которая даст меньшее значение, которое является правильным, вам нужна длина зеленой линии - вы можете получить длину зеленой линии по длине оранжевой линии и фиолетовому углу
- чтобы получить фиолетовый угол, вы можете использовать акселерометр, если используете мобильный телефон, или получить его вручную, так как вы наклоняете камеру, чтобы поместить манекен внутри красного прямоугольника.
- итак, формула такова
orang line length / sin(purple angle) = green line length
Или Green = Orange / sin(Purple)
Комментарии:
1. Извините за мой поздний ответ, но большое спасибо 🙂