Стерео Изображения ректификация

Этот пример показов, как реализовать исправление стерео изображения для калиброванной пары стереокамер. Пример модели совместим с оборудованием FPGA и обеспечивает эффективность в реальном времени. Этот пример сравнивает его результаты с Computer Vision Toolbox™ rectifyStereoImages функция.

Введение

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

Алгоритм, используемый в этом примере, выполняет удаление искажений и коррекцию выравнивания в одной системе.

Алгоритм стерео Изображения ректификации

Алгоритм выпрямления стерео-изображений использует метод обратного отображения, чтобы сопоставить пиксельные положения выходного выпрямленного изображения с пикселями во входном изображении камеры. Схема показывает четыре этапа алгоритма.

Вычислите параметры выпрямления: Этот этап вычисляет параметры выпрямления из входных параметров калибровки стереофотоаппарата. Эти параметры калибровки включают внутреннюю составляющую камеры, матрицы вращения, матрицы перемещения и коэффициенты искажения (радиальные и тангенциальные). Этот этап возвращает матрицу гомографии для каждой камеры и выходных границ. Границы выхода необходимы для вычисления целочисленных пиксельных координат выхода выпрямленного изображения, и матрицы гомографии необходимы для преобразования целочисленных пиксельных координат в выход выпрямленном изображении в соответствующие координаты неискаженного изображения.

Обратное Геометрическое Преобразование: обратное геометрическое преобразование переводит точку в одной плоскости изображения на другую плоскость изображения. При выпрямлении стерео-изображения эта операция преобразует координаты целочисленного пикселя в выходном выпрямленном изображении в соответствующие координаты изображения входной камеры с помощью матрицы гомографии H. Если (p, q) является координатой целочисленного пикселя в выпрямленном выходном изображении и (x, y) является соответствующей координатой неискаженного изображения, то это уравнение

$$[x \hspace{0.2cm} y \hspace{0.2cm} z]_{1X3} = [p \hspace{0.2cm} q
\hspace{0.2cm} 1]_{1X3} * H^{-1}_{3X3}$$

где H - матрица гомографии. Для преобразования из однородных в декартовы координаты x устанавливается в x/z, а y - в y/z.

Неискажение: Искажения объектива являются оптическими аберрациями, которые могут деформировать изображения. Существует два основных типа искажений объектива: радиальные и тангенциальные искажения. Радиальное искажение происходит, когда световые лучи изгибаются больше около ребер линзы, чем в ее оптическом центре. Тангенциальное искажение происходит, когда линза и плоскость изображения не параллельны. Для удаления искажений алгоритм сопоставляет координаты неискаженного изображения с входом изображением камеры с помощью коэффициентов искажения.

Пусть (u, v) - координаты входного изображения камеры и (x, y) - неискаженные положения пикселей. x и y нормированы от координат пикселей путем перевода в оптический центр и деления на фокусное расстояние в пикселях. Следующие уравнения описывают операцию неискажения.

$$u_{radial}=x(1+k_{1}r^{2}+k_{2}r^{4})$$
, $$u_{tangential}=2p_{1}xy+p_{2}(r^{2}+2x^{2})$$

$$v_{radial}=y(1+k_{1}r^{2}+k_{2}r^{4})$$
, $$v_{tangential}=2p_{2}xy+p_{1}(r^{2}+2y^{2})$$

где.$r^{2}=x^{2}+y^{2}$

$$ k_{1} $$,$$ k_{2} $$ являются коэффициентами радиального искажения и, $$ p_{1} $$$$ p_{2} $$являются коэффициентами тангенциального искажения.

$$u=u_{radial}+u_{tangential}$$

$$v=v_{radial}+v_{tangential}$$

Обратное геометрическое преобразование и неискажение способствуют общему отображению между координатами выходного неискаженного выпрямленного изображения (u, v) и координатами входного изображения камеры.

Интерполяция: Интерполяция повторяет значения интенсивности изображения, соответствующие сгенерированным координатам. В примере используется билинейная интерполяция.

Как показано на схеме, (u, v) является координатой входного пикселя, сгенерированного каскадом неискажения. I1, I2, I3 и I4 являются четырьмя соседними пикселями, а deltaU и deltaV являются перемещениями целевого пикселя из соседних пикселей. Этот этап вычисляет взвешенные средние значения четырех соседних пикселей с помощью этого уравнения.

$$rectifiedPixel=I_{1}(1-deltaU)(1-deltaV)+I_{2}(deltaU)(1-deltaV)+I_{3}(1-deltaU)(deltaV)+I_{4}(deltaU)(deltaV)$$

Реализация HDL

Рисунок показывает представление верхнего уровня модели StereoImageRectificationHDL. Блоки LeftInputImage и RightInputImage импортируют стерео левое и правое изображения из файлов. Блоки Frame To Pixels преобразуют эти системы координат стерео изображения в потоки пикселей с pixelcontrol шины для входа в подсистему HDLStereoImageRectification. Эта подсистема выполняет обратное геометрическое преобразование, неискажение и интерполяцию, чтобы сгенерировать выпрямленные значения выходного пикселя. Блоки Pixels To Frame преобразуют потоки выхода пикселей назад в системы координат. Подсистемы LeftImageViewer и RightImageViewer отображают входные кадры и их соответствующие выпрямленные выходы.

InitFcn модели примера импортирует параметры стерео калибровки из файла данных и вычисляет параметры выпрямления путем вызова ComputeRectificationParams.m. Кроме того, можно сгенерировать свой собственный набор параметров выпрямления и предоставить их в качестве параметров маски подсистем InverseGeometricTransform и Undistortion.

Подсистема HDLStereoImageRectification генерирует одну pixelcontrol шина от двух входных шин ctrl. Подсистема RectifiedCoordinateGeneration генерирует координаты строки и столбца пикселя выходного выпрямленного и неискаженного изображения. Он использует два HDL-счетчика, чтобы сгенерировать координаты строки и столбца. Подсистемы InverseGeometricTransform сопоставляют эти координаты с их соответствующими координатами строки и столбца (x, y) искаженного изображения. Подсистемы Undistortion сопоставляют координаты (x, y) с ее соответствующей координатой (u, v) входного изображения камеры, используя коэффициенты искажения и стереофотоаппарат.

Подсистемы интерполяции сохраняют интенсивность входных стерео изображений в памяти и вычисляют адреса четырех соседей (u, v), необходимых для интерполяции. Чтобы вычислить интенсивность каждого выпрямленного выходного пикселя, подсистема считывает четыре значения соседнего пикселя и находит их взвешенную сумму.

Обратное геометрическое преобразование

Реализация обратного геометрического преобразования HDL умножает координаты [строка col 1] с матрицей обратной гомографии. Матрица обратной гомографии (3 на 3) является маскированным параметром подсистемы InverseGeometricTransformation. ComputeRectificationParams.m, вызываемый в InitFcn модели, генерирует матрицу гомографии. Подсистема Преобразования реализует матричное умножение с блоками Product, которые умножаются на каждый элемент гомографической матрицы. Подсистема HomogeneousToCartesian преобразует сгенерированные однородные координаты [x y z] назад в декартовый формат [x y] для дальнейшей обработки. Подсистема HomogeneousToCartesian использует блок Retrical, сконфигурированный для использования ShiftAdd архитектура, и параметру UsePipelines задано значение 'on'. Чтобы увидеть эти параметры, щелкните правой кнопкой мыши блок и выберите HDL-код > Свойства HDL-блока. До этого этапа с каждой операцией разрешалось расти размер слова. После подсистемы HomogeneousToCartesian размер слова координат обрезается до размера, который все еще обеспечивает точность и точность сгенерированных координат.

Неискажение

Реализация Undistortion в HDL принимает внутреннюю матрицу камеры 3 на 3, коэффициенты искажения [k1 k2 p1 p2] и обратное значение fx и fy в качестве маскированных параметров. ComputeRectificationParams.m, который вызывается в InitFcn модели, генерирует эти параметры. Внутренняя матрица задана как.$$ \left[ {\begin{array}{ccc} fx & skew & cx\\ 0 & fy & cy\\ 0 & 0 & 1\\ \end{array} } \right] $$

Подсистема Undistortion реализует уравнения, упомянутые в разделе Stereo Изображения Rectification Algorithm, используя блоки Sum, Продукт и Сдвиг арифметики. С каждой операцией размера слова допускается рост, а затем подсистема Денормализации обрезает размер слова до размера, который все еще обеспечивает точность и точность сгенерированных координат.

Интерполяция

В этих разделах описываются три компонента подсистемы интерполяции.

Генерация адресов

Подсистема AddressGeneration принимает за вход отображенную координату входного необработанного изображения (u, v). Он вычисляет перемещение deltaU и deltaV каждого пикселя из соседних пикселей. Это также округляет координаты до ближайшее целого числа к отрицательной бесконечности.

Подсистема AddressCalculation проверяет координаты по границам входных изображений. Если какая-либо координата находится вне размерностей изображения, она ограничивается краевым значением для дальнейшей обработки. Затем подсистема вычисляет индекс адреса каждого из четырех соседних пикселей в подсистеме CacheMemory. Индекс представляет столбец кэша. Индекс для каждого адреса определяется с помощью четного и нечетного характера входящих координат столбца и строки, как определено блоком Extract Bits.

% ==========================
% |Row  || Col  || Index ||
% ==========================
% |Odd  || Odd  ||   1   ||
% |Even || Odd  ||   2   ||
% |Odd  || Even ||   3   ||
% |Even || Even ||   4   ||
% ==========================

Адрес пикселей окрестности генерируется с помощью этого уравнения:

$$Address = (\frac{Size of column}{2}*nR)+nC$$

где nR - координата строки, а nC - координата столбца.

$nR=\frac{row}{2}-1$ , $if \hspace{0.1cm}row\hspace{0.1cm} is \hspace{0.1cm}even$ , $nR=\frac{row-1}{2}$ , $if \hspace{0.1cm} row \hspace{0.1cm} is \hspace{0.1cm} odd$

$nC=\frac{col}{2}$ , $if\hspace{0.1cm} col \hspace{0.1cm}is \hspace{0.1cm}even$ , $nC=\frac{col+1}{2}$ , $if \hspace{0.1cm}col\hspace{0.1cm} is\hspace{0.1cm} odd$

После того, как все адреса и соответствующие им индексы сгенерированы, они векторизируются с помощью блока Vector Concatenate. Блок IndexChangeForMemoryAccess MATLAB Function переставляет адреса в порядке увеличения их индексов. Эта операция обеспечивает правильное получение данных из блока CacheMemory. Затем адреса даются как вход в блок CacheMemory, и индекс, deltaU и deltaV передаются в подсистему BilinearInterpolation.

Память кэша

Подсистема CacheMemory содержит блок оперативной памяти с двумя простыми портами. Входные пиксели буферизуются, чтобы сформировать [Line 1 Pixel 1 | Line 2 Pixel 1 | Line 1 Pixel 2 | Line 2 Pixel 2] в ОЗУ. Это строение позволяет алгоритму считать все четыре соседних пикселя за один цикл. Необходимый размер памяти кэша вычисляется из параметров смещения и перемещения в ComputeRectificationParams.m скрипт. Перемещение является суммой максимального отклонения и первой карты строк. Первая карта строк является максимальным значением координаты строки входа изображения, которая соответствует первой строке выхода выпрямленного изображения. Максимальное отклонение является наибольшим различием между максимальной и минимальной координатами строки для каждой строки входа карты строк изображений.

Подсистема WriteControl формирует векторы входящих пикселей, и векторы записи включают и записывают адреса. Подсистема AddressGeneration содержит вектор адресов чтения. Вектор пикселей, возвращенных из ОЗУ, передается в подсистему BilinearInterpolation.

Билинейная интерполяция

Подсистема BilinearInterpolation переставляет вектор пикселей read из кэша в их исходные индексы. Затем блок BilinearInterpolationEquation вычисляет взвешенную сумму соседних пикселей с помощью билинейного уравнения интерполяции, упомянутого в разделе «Алгоритм выпрямления Изображения стерео». Результатом интерполяции является значение выходного выпрямленного пикселя.

Симуляция и результаты

Этот пример использует стерео- изображения 960 на 1280. В пикселях входа используются uint8 тип данных. Пример не обеспечивает поддержку мультипикселей. Из-за больших форматов кадра, используемых в этом примере, симуляция может занять относительно много времени.

Рисунок показывает левое и правое входные изображения и соответствующие выпрямленные выходные изображения. Результаты модели StereoImageRectificationHDL совпадают с выходами rectifyStereoImages функция в MATLAB с ошибкой +/-1.

Можно сгенерировать HDL-код для подсистемы HDLStereoImageRectification. Для генерации HDL-кода необходимо иметь лицензию на HDL Coder™. Этот проект была синтезируем для Intel ® Arria ® 10 GX (115S2F45I1SG) FPGA. HDL- проекта достигает тактовой частоты более 150 МГц. Таблица показывает использование ресурсов для подсистемы.

% ===============================================================
% |Model Name              || StereoImageRectificationHDL  ||
% ===============================================================
% |Input Image Resolution  ||         960 x 1280           ||
% |ALM Utilization         ||           10675              ||
% |Total Registers         ||           24487              ||
% |Total RAM Blocks        ||           327                ||
% |Total DSP Blocks        ||           218                ||
% ===============================================================

Ссылки

[1] G. Bradski and A. Kaehler, Learning OpenCV: Компьютерное зрение with the OpenCV Library. Sebastopol, CA: O'Reilly, 2008.

См. также

(Computer Vision Toolbox)