Можно изменить AlternateViewPointCap или MirrorCap из воспроизведения - PullRequest
1 голос
/ 13 марта 2012

Я работаю с некоторыми данными, которые другой человек записал с помощью модуля записи OpenNI. К сожалению, они случайно включили зеркальное отображение во время записи, поэтому у меня возникло несколько проблем: 1. отразить глубину с помощью MirrorCap и 2. выровнять глубину с помощью rgb с помощью AlternateViewPointCap. Я попытался получить доступ к этим возможностям из моего узла глубины следующим образом:

xn::Context ni_context;
xn::Player player;
xn::DepthGenerator g_depth;
xn::ImageGenerator g_image;
ni_context.Init();
ni_context.OpenFileRecording(oni_filename, player);
ni_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
ni_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image); 
g_depth.GetMirrorCap().SetMirror(false);
g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);

Однако это не сработало. Даже после того, как я установил для зеркала значение false, команда IsMirrored () в g_depth по-прежнему возвращается как истина, и alternateviewpointcc не изменяет карту глубины, которую я получаю от генератора.

Я также пытался сделать это через фиктивный узел:

xn::MockDepthGenerator m_depth;
m_depth.CreateBasedOn(g_depth);
m_depth.GetMirrorCap().SetMirror(false);
m_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);
xn::DepthMetaData temp;
g_depth.GetMetaData(temp);
m_depth.SetMetaData(temp);

Это также не влияет на карту глубины, которую я получаю из m_depth. Я был бы признателен за любые предложения по выравниванию информации о цвете и глубине, Неважно, как это происходит. Эти данные трудно записать, и мне нужно использовать их так или иначе.

Мое текущее решение состоит в том, чтобы создать узел фиктивной глубины и перевернуть все пиксели, используя мою собственную процедуру, прежде чем устанавливать его с помощью функции SetMetaData. Затем я использую OpenCV, чтобы создать перспективное преобразование из изображения RGB в изображение глубины, нажимая 4 точки. Затем я применяю это преобразование к кадру rgb, чтобы выровнять значения. Это не идеально, но работает - однако, ради других людей, которым может понадобиться использовать данные, я хочу сделать более правильное решение.

Ответы [ 2 ]

1 голос
/ 13 марта 2012

К сожалению, некоторые дизайнерские решения в OpenNI, по-видимому, находились под влиянием Primesense SoC - в частности, SoC может выполнять регистрацию и зеркалирование RGB глубины на аппаратном уровне.К сожалению, это означает, что вывод генераторов, когда вы записали, - это то, что у вас есть.Извините.

Посмотрев на код в драйвере Primesense, чтобы увидеть, как они выполняют регистрацию ( XnDeviceSensorV2 / Registration.cpp ), похоже, что они не экспортируют параметры объектива вВы можете получить доступ из OpenNI, что является неудачным.Единственное хакерское решение, которое я вижу, - это модификация и перекомпиляция драйвера для экспорта данных (обратите внимание, что это код пользовательского режима, так что это не так уж и плохо. Возможно, вы захотите раскошелиться SensorKinect Avin2).

Кроме того, FYI - генераторы макетов сами по себе не выполняют никакой обработки - пример NiRecordSynthetic показывает пример того, как фиктивные узлы предназначены для использования.

0 голосов
/ 14 марта 2012

В дополнение к ответу Роуи вы можете получить доступ к данным объектива с Kinect, используя OpenNI, это немного сложно: вам нужно знать название и тип того, что вы ищете.Например, этот код извлекает ZeroPlanePixelSize и ZeroPlaneDistance генератора глубины, которые позже используются для преобразования проективных точек в точки реального мира (они меняются от устройства к устройству).

XnUInt64 zpd;
XnDouble zpps;
g_DepthGenerator.GetIntProperty("ZPD", zpd);
g_DepthGenerator.GetRealProperty("ZPPS", zpps);

Возможно, вы можете получитьалгоритмы и параметры kinect, которые вам нужны, взглянув на файлы Avin2Sensor и выяснив, где фактически выполняется преобразование глубины в точку обзора RGB.

...