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

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

Введение

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

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

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

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

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

Обратное Геометрическое преобразование: обратное геометрическое преобразование переводит точку в одной плоскости изображения на другую плоскость изображения. В исправлении стереоизображения эта операция сопоставляет целочисленные пиксельные координаты в исправленном изображении выхода к соответствующим координатам входного изображения камеры при помощи матрицы homography, 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 является матрицей homography. Чтобы преобразовать от гомогенного до декартовых координат, x установлен в x/z, и y установлен в y/z.

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

Если (u, v) координата входного изображения камеры и (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 импортируют левые и правые изображения стерео из файлов. Система координат С Пиксельными блоками преобразует эти системы координат стереоизображения в пиксельные потоки с pixelcontrol шины для входа к подсистеме HDLStereoImageRectification. Эта подсистема выполняет обратное геометрическое преобразование, неискажение и интерполяцию, чтобы сгенерировать исправленные значения выходного пикселя. Пиксели, Чтобы Структурировать блоки преобразуют потоки выходных пикселей назад к системам координат. Подсистемы LeftImageViewer и RightImageViewer отображают входные кадры и их соответствующие исправленные выходные параметры.

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

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

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

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

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

Неискажение

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

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

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

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

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

Подсистема 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$$

где номер является координатой строки, и 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. Блок MATLAB function IndexChangeForMemoryAccess перестраивает адреса в увеличивающемся порядке их индексов. Эта операция гарантирует правильную выборку данных из блока CacheMemory. Адреса затем даны как вход с блоком CacheMemory и индекс, deltaU, и deltaV передаются подсистеме BilinearInterpolation.

Кэш-память

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

Подсистема WriteControl формирует векторы входящих пикселей и векторы адресов записи и разрешений записи. Подсистема AddressGeneration обеспечивает вектор адресов чтения. Вектор пикселей, возвращенных в RAM, передается подсистеме BilinearInterpolation.

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

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

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

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

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

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

% ===============================================================
% |Model Name              || StereoImageRectificationHDL  ||
% ===============================================================
% |Input Image Resolution  ||         960 x 1280           ||
% |ALM Utilization         ||           9098               ||
% |Total Registers         ||           21349              ||
% |Total RAM Blocks        ||           333                ||
% |Total DSP Blocks        ||           200                ||
% ===============================================================

Ссылки

[1] Г. Брадский и А. Кэехлер, изучение OpenCV: компьютерное зрение с библиотекой OpenCV. Севастополь, CA: О'Райли, 2008.

Смотрите также

Для просмотра документации необходимо авторизоваться на сайте