как получить RGB значения ROI, выбранные в потоке глубины

Я написал простое приложение kinect, где я получаю доступ к значениям глубины, чтобы обнаружить некоторые объекты. Я использую следующий код, чтобы получить значение глубины

depth = NuiDepthPixelToDepth(pBufferRun);

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

В чем я не уверен:

  • мне нужно открыть поток цветного изображения?
  • или достаточно просто преобразовать глубину в цвет?
  • как я использую NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution?

Я в порядке с самым простым решением, где у меня есть рамка глубины и цветная рамка, так что я могу выбрать ROI с помощью opencv и затем соответствующим образом обрезать цветную рамку.

1

Решение

  • мне нужно открыть поток цветного изображения?

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

  • или достаточно просто преобразовать глубину в цвет?

Там нет значимого преобразования расстояния в цвет. Вам нужны два потока изображения и функция преобразования координат.

  • как я могу использовать NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution?

Это ужасно документированная функция. Иди посмотри на NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution вместо этого, потому что аргументы функции и документация действительно имеют смысл! Значение глубины и координаты глубины (x, y), координаты RGB (x, y). Просто.

Чтобы получить данные RGB в некоторых заданных координатах, вы должны сначала получить кадр RGB, используя NuiImageStreamGetNextFrame чтобы получить INuiFrameTexture пример. Вызов LockRect на это, чтобы получить NUI_LOCKED_RECT, pBits Свойство этого объекта — указатель на первый пиксель необработанного изображения XRGB. Это изображение хранится по строкам в порядке сверху вниз слева направо, причем каждый пиксель представлен 4 последовательными байтами, представляющими заполнительный байт, затем R, G и B, следующие за ним.

Пиксель в положении (100, 200) поэтому в

lockedRect->pBits[ ((200 * width * 4) + (100 * 4) ];

и байт, представляющий красный канал, должен быть в

lockedRect->pBits[ ((200 * width * 4) + (100 * 4) + 1 ];

Это стандартный 32-битный формат изображения RGB, и буфер может быть свободно передан в выбранную вами библиотеку для работы с изображениями … GDI, WIC, OpenCV, IPL, что угодно.

(предостережение … Я не совсем уверен, что у меня есть правильный порядок пикселей). Я думаю, что это XRGB, но это может быть, например, XBGR или BGRX. Тестирование, для которого фактически возвращается, должно быть тривиальным)

2

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

Других решений пока нет …

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