Следующая ссылка содержит исходный код для создания некоторых 3D-эффектов в изображениях с использованием Opencv & python. Но проблема в том, что я не могу суммировать дробные коды. Мне нужен весь исходный код, чтобы я мог его запустить. Если кто-то сможет собрать весь код, это было бы здорово для меня.
Наша проблема в том, что мы хотим нарисовать нашу трехмерную координатную ось (оси X, Y, Z)
на первом углу нашей шахматной доски. Ось X синего цвета, ось Y в
зеленый цвет и ось Z в красном цвете. Таким образом, в действительности, ось Z должна чувствовать
как будто это перпендикулярно нашей шахматной плоскости.
Во-первых, давайте загрузим матрицу камеры и коэффициенты искажения из
предыдущий результат калибровки.
import cv2
import numpy as np
import glob
# Load previously saved data
with np.load('B.npz') as X:
mtx, dist, _, _ = [X[i] for i in ('mtx','dist','rvecs','tvecs')]
Теперь давайте создадим функцию рисования, которая берет углы в
шахматная доска (полученная с помощью cv2.findChessboardCorners ()) и оси
точки для рисования трехмерной оси.
def draw(img, corners, imgpts):
corner = tuple(corners[0].ravel())
img = cv2.line(img, corner, tuple(imgpts[0].ravel()), (255,0,0), 5)
img = cv2.line(img, corner, tuple(imgpts[1].ravel()), (0,255,0), 5)
img = cv2.line(img, corner, tuple(imgpts[2].ravel()), (0,0,255), 5)
return img
Затем, как и в предыдущем случае, мы создаем критерий завершения, объект
точки (3D точки углов на шахматной доске) и точки осей. Ось
точки - это точки в трехмерном пространстве для рисования оси. Рисуем ось
длина 3 (единицы будут с точки зрения размера шахматного квадрата, так как мы
откалиброван на основе этого размера). Таким образом, наша ось X рисуется от (0,0,0) до
(3,0,0), поэтому для оси Y. Для оси Z он рисуется от (0,0,0) до
(0,0, -3). Отрицательный означает, что он обращен к камере.
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)
Теперь, как обычно, мы загружаем каждое изображение. Поиск сетки 7х6. Если найдены, мы
Уточните это с помощью пикселей под углами. Затем рассчитать вращение и
перевод, мы используем функцию, cv2.solvePnPRansac (). Однажды мы те
матрицы преобразования, мы используем их, чтобы спроецировать наши точки оси на
плоскость изображения. Проще говоря, мы находим точки на плоскости изображения
соответствующий каждому из (3,0,0), (0,3,0), (0,0,3) в трехмерном пространстве. Однажды мы
получить их, мы рисуем линии от первого угла к каждой из этих точек
используя нашу функцию draw (). Готово !!!
for fname in glob.glob('left*.jpg'):
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
if ret == True:
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
# Find the rotation and translation vectors.
rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)
# project 3D points to image plane
imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)
img = draw(img,corners2,imgpts)
cv2.imshow('img',img)
k = cv2.waitKey(0) & 0xff
if k == 's':
cv2.imwrite(fname[:6]+'.png', img)
cv2.destroyAllWindows()
См. Некоторые результаты ниже. Обратите внимание, что каждая ось имеет длину 3 квадрата.
![enter image description here](https://i.stack.imgur.com/pcJ8Q.jpg)
Визуализация куба
Если вы хотите нарисовать куб, измените функцию draw () и точки осей
следующим образом.
Модифицированная функция draw ():
def draw(img, corners, imgpts):
imgpts = np.int32(imgpts).reshape(-1,2)
# draw ground floor in green
img = cv2.drawContours(img, [imgpts[:4]],-1,(0,255,0),-3)
# draw pillars in blue color
for i,j in zip(range(4),range(4,8)):
img = cv2.line(img, tuple(imgpts[i]), tuple(imgpts[j]),(255),3)
# draw top layer in red color
img = cv2.drawContours(img, [imgpts[4:]],-1,(0,0,255),3)
return img
Модифицированные точки осей. Это 8 углов куба в трехмерном пространстве:
axis = np.float32 ([[0,0,0], [0,3,0], [3,3,0], [3,0,0],
[0,0, -3], [0,3, -3], [3,3, -3], [3,0, -3]])
И посмотрите на результат ниже:
![enter image description here](https://i.stack.imgur.com/urLVV.jpg)
Если вы заинтересованы в графике, дополненной реальности и т. Д., Вы можете использовать
OpenGL для рендеринга более сложных фигур.