Интерполяция и морфинг изображения в labview и / или openCV - PullRequest
0 голосов
/ 25 мая 2010

Я работаю над проблемой манипулирования изображениями. У меня есть оверхед-проектор, который проецируется на экран, и у меня есть камера, которая снимает это. Я могу установить соответствие 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 исчерпать память на шаге сетки сетки (камера имеет 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, потому что это один из методов разбросанной интерполяции, но лучшим тэгом будет "разбросанная интерполяция"

1 Ответ

2 голосов
/ 26 мая 2010

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

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

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

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

...