exponenta event banner

Исправление стереоизображений

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

Введение

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

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

Алгоритм исправления стереоизображений

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

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

Обратное Геометрическое Преобразование: обратное геометрическое преобразование переводит пункт в одной плоскости изображения на другую плоскость изображения. При выпрямлении стереоизображения эта операция отображает целочисленные пиксельные координаты в выходном выпрямленном изображении в соответствующие координаты входного изображения камеры с использованием матрицы гомографии, 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)$$

Внедрение ЛПВП

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

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

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

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

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

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

Неискажение

Реализация HDL Undistortion принимает внутреннюю матрицу 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 реализует уравнения, упомянутые в разделе Алгоритм исправления стереоизображений, используя арифметические блоки Sum, Product и Shift. Длина слова может увеличиваться с каждой операцией, а затем подсистема денормализации усекает длину слова до размера, который по-прежнему обеспечивает точность и точность генерируемых координат.

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

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

Формирование адреса

Подсистема 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. Функциональный блок IndexChireForMemureAccess MATLAB перестраивает адреса в порядке возрастания их индексов. Эта операция обеспечивает правильную выборку данных из блока 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 переупорядочивает вектор считанных пикселей из кэша в их исходные индексы. Затем блок BilinearInterpolationEquation вычисляет взвешенную сумму соседних пикселей, используя уравнение билинейной интерполяции, упомянутое в разделе Алгоритм исправления стереоизображений. Результатом интерполяции является значение выходного выпрямленного пикселя.

Моделирование и результаты

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

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

Можно сгенерировать HDL-код для подсистемы HDLStereyImageRectification. Для создания кода HDL необходимо иметь лицензию HDL Coder™. Эта конструкция была синтезирована для FPGA Intel ® Arria ® 10 GX (115S2F45I1SG). Конструкция ЛПВП обеспечивает тактовую частоту более 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] Г. Брадски и А. Келер, обучение OpenCV: компьютерное видение с помощью библиотеки OpenCV. Себастополь, Калифорния: О'Райлли, 2008.

См. также

(Панель инструментов компьютерного зрения)