Этот пример показов, как реализовать исправление стерео изображения для калиброванной пары стереокамер. Пример модели совместим с оборудованием FPGA и обеспечивает эффективность в реальном времени. Этот пример сравнивает его результаты с Computer Vision Toolbox™ rectifyStereoImages
функция.
Стереофотоаппарат - это система камер с двумя и более объективами с отдельным датчиком изображения для каждого объектива. Они используются для оценки расстояния, создания 3-D изображений и стереовидений. Объективы фотоаппарата искажают изображения, и выровнять две камеры, чтобы быть идеально параллельными, сложно. Итак, необработанные изображения с пары стереофотоаппаратов должны быть выпрямлены. Выпрямление стерео-изображений проецирует изображения на общую плоскость изображения таким образом, чтобы соответствующие точки в двух стерео-изображениях имели одинаковые координаты строк. Эта проекция изображения исправляет изображения, которые появляются, как если бы две камеры были параллельными.
Алгоритм, используемый в этом примере, выполняет удаление искажений и коррекцию выравнивания в одной системе.
Алгоритм выпрямления стерео-изображений использует метод обратного отображения, чтобы сопоставить пиксельные положения выходного выпрямленного изображения с пикселями во входном изображении камеры. Схема показывает четыре этапа алгоритма.
Вычислите параметры выпрямления: Этот этап вычисляет параметры выпрямления из входных параметров калибровки стереофотоаппарата. Эти параметры калибровки включают внутреннюю составляющую камеры, матрицы вращения, матрицы перемещения и коэффициенты искажения (радиальные и тангенциальные). Этот этап возвращает матрицу гомографии для каждой камеры и выходных границ. Границы выхода необходимы для вычисления целочисленных пиксельных координат выхода выпрямленного изображения, и матрицы гомографии необходимы для преобразования целочисленных пиксельных координат в выход выпрямленном изображении в соответствующие координаты неискаженного изображения.
Обратное Геометрическое Преобразование: обратное геометрическое преобразование переводит точку в одной плоскости изображения на другую плоскость изображения. При выпрямлении стерео-изображения эта операция преобразует координаты целочисленного пикселя в выходном выпрямленном изображении в соответствующие координаты изображения входной камеры с помощью матрицы гомографии H. Если (p, q) является координатой целочисленного пикселя в выпрямленном выходном изображении и (x, y) является соответствующей координатой неискаженного изображения, то это уравнение
где H - матрица гомографии. Для преобразования из однородных в декартовы координаты x устанавливается в x/z, а y - в y/z.
Неискажение: Искажения объектива являются оптическими аберрациями, которые могут деформировать изображения. Существует два основных типа искажений объектива: радиальные и тангенциальные искажения. Радиальное искажение происходит, когда световые лучи изгибаются больше около ребер линзы, чем в ее оптическом центре. Тангенциальное искажение происходит, когда линза и плоскость изображения не параллельны. Для удаления искажений алгоритм сопоставляет координаты неискаженного изображения с входом изображением камеры с помощью коэффициентов искажения.
Пусть (u, v) - координаты входного изображения камеры и (x, y) - неискаженные положения пикселей. x и y нормированы от координат пикселей путем перевода в оптический центр и деления на фокусное расстояние в пикселях. Следующие уравнения описывают операцию неискажения.
где.
, являются коэффициентами радиального искажения и, являются коэффициентами тангенциального искажения.
Обратное геометрическое преобразование и неискажение способствуют общему отображению между координатами выходного неискаженного выпрямленного изображения (u, v) и координатами входного изображения камеры.
Интерполяция: Интерполяция повторяет значения интенсивности изображения, соответствующие сгенерированным координатам. В примере используется билинейная интерполяция.
Как показано на схеме, (u, v) является координатой входного пикселя, сгенерированного каскадом неискажения. I1, I2, I3 и I4 являются четырьмя соседними пикселями, а deltaU и deltaV являются перемещениями целевого пикселя из соседних пикселей. Этот этап вычисляет взвешенные средние значения четырех соседних пикселей с помощью этого уравнения.
Рисунок показывает представление верхнего уровня модели 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 модели, генерирует эти параметры. Внутренняя матрица задана как.
Подсистема 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 || % ==========================
Адрес пикселей окрестности генерируется с помощью этого уравнения:
где nR - координата строки, а nC - координата столбца.
, , ,
, , ,
После того, как все адреса и соответствующие им индексы сгенерированы, они векторизируются с помощью блока 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.
rectifyStereoImages
(Computer Vision Toolbox)