Код: Выделить всё
std::vector worldPoints = {
cv::Point3f(0, 0, 0),
cv::Point3f(2000, 0, 0),
cv::Point3f(0, 3000, 0),
cv::Point3f(2000, 3000, 0),
};
std::vector imagePoints = {
cv::Point2f(-0.958707, -0.219624),
cv::Point2f(-1.22234, 0.577061),
cv::Point2f(0.0837469, -0.1783),
cv::Point2f(0.205473, 0.428184),
};
< /code>
Эффективно, уравнение i думать < /em> я пытаюсь решить (см. Эквивалент в документации OpenCV): < /p>
/ xi \ / fx 0 \ / tx \ / Xi \
s | yi | = | fy 0 | | Rxyz ty | | Yi |
\ 1 / \ 1 / \ tz / | Zi |
\ 1 /
< /code>
где: < /p>
[list]
[*]i[*]
Код: Выделить всё
xi, yi[*]
Код: Выделить всё
fx, fy[*]
Код: Выделить всё
Rxyz[*]
Код: Выделить всё
tx, ty, tz[*]
Код: Выделить всё
Xi, Yi, Zi[/list]
, поэтому у меня есть 8 уравнений (по 4 балла по 2 координата каждая), и у меня есть 8 неизвестных (
Код: Выделить всё
fx, fyКод: Выделить всё
getPerspectiveTransform< /ul>
Я также посмотрел на модуль Calib3d, который содержит несколько многообещающих функций, которые выполняют почти, но не совсем, что мне нужно: < /p>
Код: Выделить всё
initCameraMatrix2D< /code> звучит почти идеально, но когда я передаю его четыре очка, как это: < /p>
cv::Mat cameraMatrix = cv::initCameraMatrix2D(
std::vector({worldPoints}),
std::vector({imagePoints}),
cv::Size2f(2, 2), -1);
Код: Выделить всё
calibrateCameraOpenCV(3.4.1) Error: Assertion failed (0 < /li>
< /ul>
Есть ли способ побудить OpenCV сделать то, что мне нужно? А если нет, как я мог сделать это вручную?
Подробнее здесь: https://stackoverflow.com/questions/506 ... our-points
Мобильная версия