Как преобразовать данные глубины из Kinect 2.0 в значение расстояния?

Я хотел бы воспользоваться преимуществом датчика глубины Kinect 2.0 SDK, но не в том смысле, что эти данные рисуются или отображаются в формате изображения, а скорее в виде целого числа или чего-то подобного. Примером этого является то, что если моя рука находится очень близко к Kinect, я получу целочисленное значение, указывающее мне приблизительно расстояние между камерой и препятствием.
может быть как то так Когда препятствие движется, Kinect пересчитывает расстояние и обновляет, возможно, каждую секунду или полсекунды.

The distance between the kinect and the obstacle is 20 cm
The distance between the kinect and the obstacle is 10 cm
The distance between the kinect and the obstacle is 100 cm

Это возможно?
Я искал учебники, но все, что я мог бы найти, это то, что для представления обычно используется облако точек или черно-белое изображение глубины.

1

Решение

Несмотря на то, что этот вопрос был задан некоторое время назад, и опрашивающий, скорее всего, решил его самостоятельно, я просто хотел дать всем остальным, у кого может быть такая же проблема / вопрос, код C ++ для решения этой проблемы.

Примечание: решение основано на Kinect 2.0 SDK, и, если я правильно помню, я взял его из одного из примеров, представленных в SDK Browser 2.0, который поставляется с Kinect 2.0 SDK. Я удалил все специальные модификации, которые я сделал, и просто оставил самые важные аспекты (так что вам, скорее всего, придется изменить void и дать ему какой-то возвращаемый параметр).

m_pDepthFrameReader как инициализировано IDepthFrameReader*

void KinectFusionProcessor::getDistance() {
IDepthFrame* frame = NULL;
if (SUCCEEDED(m_pDepthFrameReader->AcquireLatestFrame(&frame))) {
int width = 512;
int height = 424;
unsigned int sz=(512*424);
unsigned short buf[525 * 424] = {0};
frame->CopyFrameDataToArray(sz,buf);

const unsigned short* curr = (const unsigned short*)buf;
const unsigned short* dataEnd = curr + (width*height);

while (curr < dataEnd) {
// Get depth in millimeters
unsigned short depth = (*curr++);
}
}
if (frame) frame->Release();
}
2

Другие решения

Kinect действительно использует облако точек. И каждый пиксель в облаке точек имеет короткое целое число без знака, которое представляет расстояние в мм от Kinect. Из того, что я могу сказать, камера уже способна компенсировать, или объекты по сторонам своего обзора находятся дальше, чем то, что находится спереди, поэтому все данные представляют глубину, на которой эти объекты находятся далеко от плоскости, с которой камера Kinects просматривает.
Kinect будет просматривать на расстоянии до 8 метров, но имеет надежные данные только на расстоянии 4-5 метров и не может видеть ничего ближе, чем на 0,5 метра.
Поскольку это звучит как использование вами в качестве системы обнаружения препятствий, я бы посоветовал отслеживать все точки данных в облаке точек и усреднять сгруппированные точки данных, которые стоят отдельно от других, и интерпретировать их как свои собственные объекты с приблизительным расстоянием. Kinect также обновляется со скоростью 30 кадров в секунду (при условии, что ваше оборудование может обрабатывать интенсивный поток данных). Таким образом, вы просто будете постоянно следить за облаком точек на предмет изменения расстояния.

Если вы начнете с загрузки SDK и Kinect Studio, вы сможете использовать примеры программирования глубины / ИК и студию, чтобы лучше понять, как можно использовать данные.

2

Это довольно просто. Я не знаю точный код в C++ но в C #, когда у вас есть рамка глубины, вам нужно сделать следующее:
Я предполагаю, что вы уже знаете, что Y и X указывают, где вы хотите оценить значение глубины.

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

После этого вам нужно вычислить индекс в пределах глубины пикселей, который соответствует вашим точкам X и Y. Обычно используется это уравнение:

// Get the depth for this pixel
ushort depth = frameData[y * depthFrameDescription.Height + x];

Я надеюсь, что это может быть полезно.

1
По вопросам рекламы [email protected]