2012-11-08 6 views
2

Я использую SDK Windows Kinect для получения глубины и изображений RGB с датчика.Kinect: Преобразование из координат RGB в координаты глубины

Поскольку изображение глубины и изображения RGB не выравниваются, я хотел бы найти способ преобразования координат изображения RGB в изображение изображения глубины, так как я хочу использовать маску изображения на изображении глубины Я получил некоторую обработку изображения RGB.

Существует уже способ преобразования глубины в координаты цветового пространства:

NuiImageGetColorPixelCoordinatesFromDepthPixel 

, к сожалению, обратное не существует. Существует только тайный звонок в INUICoordinateMapper:

HRESULT MapColorFrameToDepthFrame(
    NUI_IMAGE_RESOLUTION eColorResolution, 
    NUI_IMAGE_RESOLUTION eDepthResolution, 
    DWORD cDepthPixels, 
    NUI_DEPTH_IMAGE_PIXEL *pDepthPixels, 
    DWORD cDepthPoints, 
    NUI_DEPTH_IMAGE_POINT *pDepthPoints 
) 

Как работает этот метод не очень хорошо документирован. Кто-нибудь использовал его раньше?

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

+0

Я не могу вам помочь, но не могли бы вы уточнить, как изображения не совпадают? Я думал, что они такие же. Есть ли фиксированное смещение или они отличаются от поля зрения? – jaho

+1

Я сейчас в той же ситуации. И нашел эту страницу. http://social.msdn.microsoft.com/Forums/en-US/kinectsdknuiapi/thread/e42ebb04-6581-4288-947e-1a75b53bf22d Я попробую это. но если вы найдете путь, пожалуйста, дайте мне знать. –

+2

@Marian существует определенное количество ошибок при параллаксе ... если вы посмотрите на устройство, вы можете заметить, что два приемника слегка разделены. Преобразование между двумя системами координат не совсем прямолинейно. – Rook

ответ

2

Спасибо комментатору horristic, я получил ссылку на msdn с полезной информацией (спасибо также T. Chen за msdn за помощь в API). Извлеченный от должности Т. Чена, вот код, который будет выполнять отображение из RGB глубины пространства координат:

INuiCoordinateMapper* pMapper; 

mNuiSensor->NuiGetCoordinateMapper(&pMapper); 

pMapper->MapColorFrameToDepthFrame(
     NUI_IMAGE_TYPE_COLOR, 
     NUI_IMAGE_RESOLUTION_640x480, 
     NUI_IMAGE_RESOLUTION_640x480, 
     640 * 480, 
     (NUI_DEPTH_IMAGE_PIXEL*)LockedRect.pBits, 
     640 * 480, 
     depthPoints); 

Примечание: необходим датчик для инициализации и глубина кадра заблокирована для этой работы.

трансформированные координаты могут, например, быть запрошено следующим образом:

/// transform RGB coordinate point to a depth coordinate point 
cv::Point TransformRGBtoDepthCoords(cv::Point rgb_coords, NUI_DEPTH_IMAGE_POINT * depthPoints) 
{ 
    long index = rgb_coords.y * 640 + rgb_coords.x; 
    NUI_DEPTH_IMAGE_POINT depthPointAtIndex = depthPoints[index]; 
    return cv::Point(depthPointAtIndex.x, depthPointAtIndex.y); 
} 
1

Насколько я могу судить, MapColorFrameToDepthFrame эффективно управляет преобразованием системы координат на каждый пиксель вашего изображения RGB, сохраняя координаты изображения глубины в результате преобразования и результирующего значения глубины в массиве вывода NUI_DEPTH_IMAGE_POINT. Определение этой структуры находится здесь: http://msdn.microsoft.com/en-us/library/nuiimagecamera.nui_depth_image_point.aspx

Возможно, это излишне для ваших нужд, но я не знаю, насколько быстро этот метод. Разработчики XBOX Kinect имеют очень быструю реализацию этой функции, которая работает на графическом процессоре с частотой кадров, разработчикам Windows, возможно, не очень повезло!

+0

Производительность, похоже, совсем не страдает от Windows 7. Однако я не знаю, используется ли GPU или нет. – Koffiman

+0

@ Koffiman это приятно знать. Я почти уверен, что в ранних версиях SDK не было никакого GPU-аксессуара, но, я думаю, вполне возможно, что это делают последние. – Rook

Смежные вопросы