Хотите найти поворот и положение в перспективном мире плоскости из 2d точек на изображении

#opencv #transformation #homography #perspectivecamera #opencv-solvepnp

Вопрос:

У меня есть 2D png изображение рамка

Я хочу разместить 3D-плоскость в идеальном повороте и положении дивана, как показано на рисунке заключительный кадр

Я использую three.js и перспективная камера для ручного добавления поворота и перемещения в плоскость.

У меня есть координаты центра и угла области, в которой расположена зеленая плоскость. У меня есть исходное положение в 3D — координатах — (0,0,0) и вращение — (0,0,0). У меня есть начальные точки объекта (0,0),(0,100),(140,0),(1 как начальный кадр

Я хочу преобразовать начальный кадр в конечный кадр, используя OpenCV и three.js. Как найти угол наклона зеленой плоскости в последнем кадре из этого 2D-изображения, чтобы повернуть и перевести зеленую плоскость в белую плоскость?

Наша конечная цель-разместить 3D-объект на такой плоскости, как эта — окончательное изображение

Я пытался решить то же самое с помощью OpenCV solvePnP, но не получил желаемого результата, его вращение и вектор преобразования не работают, и это дает неправильный результат.

Комментарии:

1. просто работайте с омографиями.

2. вы не собираетесь оценивать параметры камеры (поле зрения) для этого, так что нет, это единственное решение, если вам нужна перспективная проекция. определите четыре точки, используйте getPerspectiveTransform.

3. Спасибо, @ChristophRackwitz, мы не хотим преобразовывать плоскость в перспективе, мы пытаемся разместить 3D-объект. Я поделился изображением в отредактированном вопросе.

4. Если вы можете обнаружить/отследить 4 точки на этой плоскости, вы можете вычислить гомографию для этой плоскости. Из декомпозиции вы можете вычислить поворот/перемещение камеры между кадрами. С помощью этого вы можете спроецировать 3D-объект. Если вы не можете отслеживать плоскость (например, потому, что это не настоящая плоскость), вам придется вычислять движение/позу камеры другим способом.

5. Вы даже можете использовать гомографию для подвыборки 3D-плоскости (создать NxN точек изображения на этой плоскости), а затем использовать камеру calibrateCamera. Очевидно, что вы не получите идеальных результатов, если у вас нет коэффициентов искажения, внутренних характеристик и т. Д.

Ответ №1:

Пример использования OpenCV вычисляет гомографию и переносит изображение для выбора области в python.

Сначала загрузите изображение в формате 2D png и изображение баннера, изображение баннера заменит белую область.

 import cv2
import numpy as np

img = cv2.imread("2D png image.png")
banner = cv2.imread("replace region img.jpg")
 

Затем вручную выберите четыре угла(углы дивана на вашем изображении), чтобы определить, заменить область.

 #point sequence:top_left corner, top right corner, bottom left corner, bottom left corner
pt = np.array([[65,180], [122, 192], [122, 277], [67, 251]]) 
 

Далее, получите четыре угла изображения нашего баннера.

 #point sequence same as hand select :top_left corner, top right corner, bottom left corner, bottom left corner
pts_banner = np.array([[0, 0], [banner.shape[1] - 1, 0], [banner.shape[1] - 1, banner.shape[0] - 1], [0, banner.shape[0] - 1]])
 

Затем с помощью OpenCV вычислите матрицу гомографии и перенесите изображение в область замены.

 homographyMat, status = cv2.findHomography(pts_banner, pt)
result1 = cv2.warpPerspective(banner, homographyMat, (img.shape[1], img.shape[0]))
 

Наконец, просто выберите регион и добавьте изображение обертки к входному изображению.

 cv2.fillConvexPoly(img, pt, (0,0,0))
result2 = img   result1
cv2.imwrite("result.png", result2)
 

изображение баннера:

введите описание изображения здесь

выход:

введите описание изображения здесь

Ссылка:

https://anishdubey.com/virtual-billboard-homography-perspective-geometric-transformation-image-opencv

Комментарии:

1. Спасибо, @yanzzz , но это не совсем то, чего мы хотим. Наряду с плоскостью мы также хотим разместить 3D-объект, который имеет ориентацию вращения (вектор нормали), как и плоскость.