Я уже использовал код калибровки, предоставленный opencv, чтобы откалибровать свою камеру, и все прошло нормально! Я также могу отменить искажение любого изображения, применяя параметры, используя код, написанный на Python.
import numpy as np
import cv2
# copy parameters to arrays
K = np.array([[385.58130632872212, 0, 371.50000000000000], [0, 385.58130632872212, 236.50000000000000], [0, 0, 1]])
d = np.array([-0.27057628187805571, 0.10522881965331317, 0, 0, 0]) # just use first two terms (no translation)
# read one of your images
img = cv2.imread("C:\Users\ROS\Documents\Python\VCSBC2.jpg")
h, w = img.shape[:2]
# undistort
newcamera, roi = cv2.getOptimalNewCameraMatrix(K, d, (w,h), 0)
newimg = cv2.undistort(img, K, d, None, newcamera)
cv2.imwrite("original.jpg", img)
cv2.imwrite("undistorted.jpg", newimg)
Но тогда проблема в том, что я действительно не знаю, как искажать изображения во время передачи в реальном времени. Я использую протокол TCP / IP для получения изображений с моей камеры, и я могу запустить что-то изнутри, но я понятия не имею, как я должен быть в состоянии вставить матрицу и параметры туда, чтобы получить неискаженный изображения в режиме реального времени. Есть ли кто-нибудь, кто может подсказать мне об этом?
Спасибо.
Трудно дать совет, не видя код, который вы используете для извлечения изображений из камеры. Вообще говоря, если ваши требования к частоте кадров достаточно низки, вы можете просто получить пиксельные буферы с камеры, скопировать их в cv-изображение и применить неискаженное изображение.
При более высокой частоте кадров cv неискаженное изображение может оказаться слишком медленным, поскольку оно вычисляет нелинейное преобразование для каждого пикселя перед этапом билинейной (или трилинейной) интерполяции.
У вас есть два варианта
Предварительно вычислить карты деформации. Это матрицы, которые кэшируют вышеуказанные нелинейные вычисления (в двух каналах, отдельно по горизонтали и вертикали) и повторно используют их для каждого кадра. Реализация OpenCV этот подход несколько неудачен, поскольку требует карт преобразования того же размера, что и входное изображение, что бесполезно, когда искажение везде плавное и достаточно умеренное, чтобы можно было уменьшить частоту дискретизации. В этих случаях при достаточно больших изображениях и частоте кадров поиск в полноразмерной карте является расточительным и может стать узким местом. Если каждый бросает свою собственную реализацию карты деформации с понижающей дискретизацией, необходимо позаботиться о том, чтобы частота дискретизации была достаточно высокой, чтобы гарантировать правильное искажение повсюду (особенно на границах изображения). Это обычно приводит к тому, что карты деформации «плотнее», чем они должны быть, поскольку искажение на границах изображения обычно возрастает круче, чем в центре. Однако это простой и зачастую «достаточно хороший» подход, и многие профессиональные приложения широко его используют (например, Shake).
Используйте неоднородную кусочно-линейную аппроксимацию. Здесь идея состоит в том, чтобы подразделить холст изображения, используя дерево квадратов, пока ошибка в аппроксимации нелинейной деформации в каждом кваде, используя гомографию, вызванную деформацией только вершин самого квада, не станет меньше порогового значения (например, 1/10 от пикселей). Преимущество состоит в том, что линейное деформирование квадратора быстрое и может быть реализовано внутри цикла интерполяции. При достаточно умеренном искажении этот метод использует только несколько уровней квадродерева, а при использовании простой реализации с графической библиотекой (например, OpenGL) довольно легко достичь высокой частоты кадров при большом разрешении. Я лично использовал эту технику, начавшуюся около десяти лет назад, и мог легко разогнать изображения со скоростью 60FPS при разрешении HD-видео.