Форум программистов, компьютерный форум, киберфорум
C++: OpenCV
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 10.09.2023
Сообщений: 70

Перевод координат изображения в мировые

03.02.2025, 14:06. Показов 8736. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите пожалуйста понять какой алгоритм действий нужен для того чтобы перевести координаты объекта на изображении в его реальные координаты. Камера направлена вертикально вниз.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2025, 14:06
Ответы с готовыми решениями:

Перевод из оконных координат в мировые
Знаю, что конечная матрица, выходящая на экран, формируется следующим образом MVPmatrix = projection * view * model; Пытаюсь...

DirectX11 перевод локальных координат в мировые
Добрый день. Подскажите пожалуйста и желательно приведите пример: как с помощью directxmath.h перевести локальные координаты в мировые,...

Преобразование экранных координат в мировые
Собственно как и чем можно преобразовать экранные координат курсора мыши в мировые ???

6
 Аватар для andrey_f
882 / 535 / 228
Регистрация: 21.02.2011
Сообщений: 5,706
12.02.2025, 12:36
Для начала вам нужно откалибровать вашу камеру. Это позволит вам получить параметры камеры, такие как фокусное расстояние и центры оптической оси. Калибровка даст вам матрицу камеры (K) и коэффициенты искажения. Необходимо знать положение камеры относительно объекта (высоту, угол наклона и т.д.), а также размеры объекта или расстояние до него. Если камера направлена вертикально вниз, то вам важно знать высоту камеры над объектом.
0
2 / 2 / 0
Регистрация: 10.09.2023
Сообщений: 70
12.02.2025, 14:52  [ТС]
Спасибо за ответ. Немного поясню свою задачу. Я делаю макет робота, который играет в шашки. Камера закреплена неподвижно и смотрит вертикально вниз. Известно высота камеры над объектом (шашкой). Я нахожу координаты шашки на изображении и их мне надо как-то переводить в мировые.

Что я понял на данный момент:
Нужно откалибровать камеру при помощи датасета с изображениями шахматной доски в разных положених и ориентациях с использованием функции calibrateCamera. Эта функция возвращает mtx, dist, rvecs, tvecs. Первые два значения - это матрица внутренних параметров камеры и коэфициенты дисторсии. Их можно сохранить в файл и затем переиспользовать.
Не до конца понимаю rvecs и tvecs. Если у меня камера неподвижна, то в rvecs и tvecs записываются векторы трансляции и поворота системы координат шахматной доски относительно системы координат камеры для каждого кадра из датасета для калибровки? Так ведь?

Ну и как теперь переходить от координат на изображении в реальные координаты я тож не пойму. Я думал в процессе калибровки разместить калибровочный паттерн в одном из кадров так, чтобы его система координат совпала с системой шашечной доски. Взять получившиеся rvecs и tvecs для этого кадра. Это получится матрица внешних параметров. Ну и потом у меня есть матрицы внутренних и внешних параметров, коефициенты дисторсии, высоту я знаю, и по идее тогда могу получать координаты шашек в мм в системе доски. Но как это сделать?
0
 Аватар для andrey_f
882 / 535 / 228
Регистрация: 21.02.2011
Сообщений: 5,706
13.02.2025, 10:57
вот пример реализации, вам так нужно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <opencv2/opencv.hpp>
#include <iostream>
 
void pixelToWorld(const cv::Point2f& pixel, const cv::Mat& mtx, const cv::Mat& rvec, const cv::Mat& tvec, float height, cv::Point3f& worldCoord) {
    // 1. Нормализуем пиксельные координаты
    cv::Mat normalizedCoords = mtx.inv() * cv::Mat(cv::Vec3f(pixel.x, pixel.y, 1));
 
    // 2. Умножаем на высоту
    cv::Mat worldCoords = height * normalizedCoords;
 
    // 3. Применяем матрицу внешних параметров
    cv::Mat R;
    cv::Rodrigues(rvec, R); // Преобразуем в матрицу вращения
    cv::Mat t = tvec.clone();
 
    // 4. Переводим в мировые координаты
    cv::Mat worldCoordsTransformed = R * worldCoords + t;
 
    // 5. Сохраняем результат
    worldCoord = cv::Point3f(worldCoordsTransformed.at<float>(0), worldCoordsTransformed.at<float>(1), worldCoordsTransformed.at<float>(2));
}
 
int main() {
    // Загрузка матрицы внутренних параметров и коэффициентов дисторсии
    cv::Mat mtx; // Загрузите вашу матрицу
    cv::Mat dist; // Загрузите ваши коэффициенты дисторсии
    cv::Mat rvec; // Вектор вращения
    cv::Mat tvec; // Вектор трансляции
 
    cv::Point2f pixel(100, 200); // Пример пиксельных координат шашки
    float height = 100; // Высота камеры над шашкой в мм
    cv::Point3f worldCoord;
 
    pixelToWorld(pixel, mtx, rvec, tvec, height, worldCoord);
 
    std::cout << "World Coordinates: " << worldCoord << std::endl;
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 04.08.2025
Сообщений: 25
06.08.2025, 04:19
вот пример реализации, вам так нужно?
Сделал по вашему примеру, компилируется без ошибок , но при выполнении кода выдает критическую ошибку (исключение) на строке cv::Mat normalizedCoords = mtx.inv() * cv::Mat(cv::Vec3f(pixel.x, pixel.y, 1));

В чем может быть причина ?
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
06.08.2025, 12:10
Цитата Сообщение от v-v-v Посмотреть сообщение
В чем может быть причина ?
перехватите исключение и помотрите о чем оно сообщает, вероятно причина в том что размерности матриц не позволяют их перемножить - матрицы несовместимы, то есть число столбцов в mtx не равно числу строк в v::Mat(cv::Vec3f(pixel.x, pixel.y, 1));

Цитата Сообщение от MeXaL Посмотреть сообщение
Я нахожу координаты шашки на изображении и их мне надо как-то переводить в мировые.
На правах фантазии. Я бы пошел эмпирическим путем: у Вас ведь шахматная доска, определить границы банально, берете манипулятор робота и двигаете вдоль одной из сторон доски с минимальным шагом и считаете количество шагов от края до края (небо в огне сгорает... простите не удержался) - таким образом Вы будете знать размер доски на изображении от камеры в шагах и, теперь, разметить доску на изображении тривиальная задача.
1
0 / 0 / 0
Регистрация: 04.08.2025
Сообщений: 25
07.08.2025, 06:21
Цитата Сообщение от Annemesski Посмотреть сообщение
перехватите исключение и помотрите о чем оно сообщает, вероятно причина в том что размерности матриц не позволяют их перемножить - матрицы несовместимы, то есть число столбцов в mtx не равно числу строк в v::Mat(cv::Vec3f(pixel.x, pixel.y, 1));
Спасибо большое ! Я проверю это.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2025, 06:21
Помогаю со студенческими работами здесь

Преобразование координат мыши в мировые координаты
Привет всем! Начал писать 3d игру и возникла проблема: преобразование координат. Дело в том, что я преобразовать координаты(точнее найти...

Перевод в мировые координаты
Проблема такая: у меня есть координаты мыши: mousePos , есть матрица view - view, есть матрица перспективной проекции: pMatrix Я перевожу...

Поворот изображения. Неверное вычисление координат нового изображения
Всем привет. Помогите решить проблему. У меня стоит задача: загрузить изображение и повернуть (на любой угол). Я написал вот такой код: ...

Перевод координат в другую систем координат
как перевести плоские координаты хyz в другую систему координат x1y1z1 по трем и более точкам?

Установка координат изображения
Хочу изображение поставить в определённіх кординатах. К приеру пишу вот такой код: &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru