Интерполяция и морфинг изображения в labview и/или openCV

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

proj_x, proj_y ‹--> cam_x, cam_y для разбросанных пар точек

Мой первоначальный план состоял в том, чтобы упорядочить эту карту, используя функцию griddata Mathscript. Это будет хорошо работать в MATLAB, как показано ниже.

[pgridx, pgridy] = meshgrid(allprojxpts, allprojypts)
fitcx = griddata (proj_x, proj_y, cam_x, pgridx, pgridy);
fitcy = griddata (proj_x, proj_y, cam_y, pgridx, pgridy);

и обратное для сопоставления камеры с проектором

К сожалению, этот код приводит к тому, что Labview исчерпывает память на шаге meshgrid (камера имеет разрешение 5 мегапикселей, что, по-видимому, слишком много для обработки labview).

Затем я начал просматривать openCV и нашел функцию cvRemap. К сожалению, эта функция использует в качестве отправной точки регуляризованную пиксельную карту, подобную той, которую я пытался сгенерировать выше. Однако это заставило меня надеяться, что функции для создания такой карты могут быть доступны в openCV. Я не смог найти его в API openCV 1.0 (я застрял с 1.0 по устаревшим причинам), но я надеялся, что он там или у кого-то есть простой трюк.

Итак, мой вопрос является одним из следующих

1) Как я могу интерполировать из разбросанных точек в сетку в openCV; (т.е., учитывая z = f(x,y) для разбросанных значений x и y, как заполнить изображение f(im_x, im_y)?

2) Как я могу выполнить преобразование изображения, которое сопоставляет изображение 1 с изображением 2, учитывая, что я знаю рассеянное отображение точек в системе координат 1 в системе координат 2. Это может быть реализовано либо в Labview, либо в OpenCV.

Примечание. Я помечаю этот пост как delaunay, потому что это один из методов выполнения рассеянной интерполяции, но лучшим тегом будет «рассеянная интерполяция».


person Marc    schedule 24.05.2010    source источник
comment
Какую версию LV вы используете? Проблема нехватки памяти с meshgrid должна была быть исправлена ​​в LV2009... по крайней мере, это было для нас. Не то, чтобы обновления всегда были опцией, я знаю :(.   -  person Joe Z    schedule 25.05.2010
comment
8.5. У нас есть лицензия сайта, так что теоретически я могу обновиться до последней версии. На практике 2009 год выглядит как серьезное обновление, и я не хочу ломать существующий код. Знаете ли вы, характерна ли ошибка памяти для mathscript? На палитре интерполяции и экстраполяции есть vi, который делает то же самое, так что я мог бы просто забить его. Спасибо, Марк   -  person Marc    schedule 25.05.2010
comment
Хорошо, я смог заставить его работать, используя vi на поддоне i&e вместо meshgrid.   -  person Marc    schedule 25.05.2010


Ответы (1)


Таким образом, это становится конкретным исправлением ошибок в Labview 8.5. Тем не менее, поскольку они плохо документированы, и я потратил на них целый день боли, я думаю, что опубликую их, чтобы кто-то другой, гугливший эту проблему, наткнулся на нее.

1) Сетчатые бомбы. Не знаю, когда это было исправлено, определенно ошибка в 8.5. Решение: вместо этого используйте функцию, подобную сетке, на палитре интерполяции и экстраполяции. Или обновитесь до LV2009, который, по-видимому, работает (спасибо Underflow)

2) Griddata неисправен в 8.5. Это плохо задокументировано. В примечаниях к обновлению 8.6 говорится, что проблема с данными сетки и настройкой «кубическая», но на самом деле это также проблема с настройкой DEFAULT LINEAR. Решения в порядке убывания халтурности: 1) передать флаг 'v4', который делает какую-то сплайн-интерполяцию, но не имеет багов. 2) обновиться как минимум до версии 8.6. 3) Бить инженеров тростником, пока они не задокументируют ошибки должным образом.

3) Я смог использовать функцию переназначения openCV для фактического преобразования одного изображения в другое. Я пытался просто использовать Matlab, встроенный в interp2 vi, но он задыхался от больших массивов и выдавал мне ошибки памяти. С другой стороны, довольно просто сопоставить образ IMAQ с образом IPL, так что это не так уж и плохо, за исключением добавления внешней библиотеки.

person Marc    schedule 25.05.2010