• Как получить координаты объекта по фоторгафии?

    Итак, прежде всего мы можем говорить о наличии двух систем координат - мировой и наблюдателя (view, если в терминах графики). Любое преобразование из трехмерной мировой в трехмерную СК наблюдателя можно осуществить с помощью некоторой матрицы V размера 4x4. Т.е.:
    (xv, yv, zv, 1) = V * (xw, yw, zw, 1)
    где (xv, yv, zv) - координаты наличника на фото, а xw, yw, zw - реальные, которые нам надо получить для расчета размеров.
    Есть две задачи:
    1) вычислить V
    2) т.к. zv у нас нет (в фотоаппарате нет дальномера), то нужно будет его определять по смещению на двух фотографиях. Тогда можно говорить о ДВУХ матрицах V1 и V2, и решить систему уравнений:
    (xv1, yv1, zv1, 1) = V1 * (xw1, yw1, zw1, 1)
    (xv2, yv2, zv2, 1) = V2 * (xw2, yw2, zw2, 1)
    Неизвестные у нас: zv1, zv2; xw1, yw1, zw1; xw2, yw2, zw2. По идее, уравнений тоже будет 8 после раскрытия операции умножения матрицы, так что система должна решаться (конечно если V1 и V2 уже найдены)
    Искать V1 и V2 надо, очевидно, по коробке. Для этой коробки известны мировые координаты, и координаты на фотографии. Т.е. в выражении:
    (xv, yv, zv, 1) = V * (xw, yw, zw)
    Неизвестных у вас: zv и все элементы матрицы, которых 16 штук (возможно меньше, надо подумать что точно из себя представляет эта матрица, включающая перпспективную проекцию). По идее можно набрать нужное количество эталонных точек на коробке, чтобы найти все элементы матрицы.
    Ответ написан
    5 комментариев
  • Как осуществить заливку "шахматкой" для фона прозрачного рисунка на C#?

    т.к. речь идёт о производительности, то я бы сразу предпочёл заливку вручную, без использования кистей. так сказать, "во избежание недоразумений". то есть, 2 LockBits и ручная построчная копия (не надо BLITтить или DrawImage) в цикле. ну да, а картинка для заливки вон там у Вас выше создаётся=) вполне себе статичненькая)
    Ответ написан
    Комментировать