2013-07-30 3 views
4

Я использую OpenNI и OpenCV (но без последнего кода с поддержкой openni). Если я просто отправлю канал глубины на экран - он будет выглядеть темным и трудно что-то понять. Поэтому я хочу показать канал глубины для пользователя в цвете, но не могу найти, как это сделать, не теряя точности. Теперь я делаю это так:Преобразование глубины кинов в RGB

xn::DepthMetaData xDepthMap; 
depthGen.GetMetaData(xDepthMap); 
XnDepthPixel* depthData = const_cast<XnDepthPixel*>(xDepthMap.Data()); 
cv::Mat depth(frame_height, frame_width, CV_16U, reinterpret_cast<void*>(depthData)); 

cv::Mat depthMat8UC1; 
depth.convertTo(depthMat8UC1, CV_8UC1); 

cv::Mat falseColorsMap; 
cv::applyColorMap(depthMat8UC1, falseColorsMap, cv::COLORMAP_AUTUMN); 
depthWriter << falseColorsMap; 

Но в этом случае я хуже (проигрышные данные) выход, чем, например, kinects программное обеспечение для окон показывает мне. Поэтому я ищу функцию в OpenNI или OpenCV с лучшей трансформацией.

ответ

1

Попробуйте это:

const float scaleFactor = 0.05f; 
depth.convertTo(depthMat8UC1, CV_8UC1, scaleFactor); 
imshow("depth gray",depthMat8UC1); 

Play со значением, чтобы получить результат, вы будете довольны

+0

Не должен scaleFactor быть 255/max (глубина)? –

+0

255.0/4096.0 = 0.062255859375, поэтому вы можете попробовать это. На практике не все 4096 значений можно использовать, хотя (по мере того как точность падает экспоненциально), я думаю. Если вы просто хотите применить другое отображение для визуализации, вы можете просто добавить слайдер для коэффициента масштабирования и немного поработать, чтобы получить масштабирование/диапазон, который вы хотите –

2

ghttps: //github.com/OpenNI/OpenNI2/blob/master/Samples/Common /OniSampleUtilities.h ссылка - это код для выравнивания гистограммы. Короче говоря, это делает вероятность каждого уровня равным и оптимизирует отображение между 10000 уровнями и 255 уровнями. Вот почему желтоватая карта Kinect выглядит лучше, чем наивная I = 255 * z/z_range.

ПРИМЕЧАНИЕ: не используйте цвет для визуализации, так как человеческий глаз более чувствителен к изменению яркости, чем к изменению цвета. Таким образом, с 255 уровнями яркости вы получите лучший контраст, чем с 255 * 255 * 255 уровнями цвета. Если вы все же решите пойти по прожектору цветного изображения, используйте цветовое пространство HSV, где вы можете манипулировать оттенком 0..360 град, значение 1..0 и лучше установить насыщенность до макс. Глубина карты до оттенка и значения, конвертировать в RGB и отображать. Затем вернитесь к выравниванию гистограммы;)

+0

Наконец, добавлена ​​эта нормализация в код: https: // github. ком/KirillLykov/oni2avi/BLOB/Master/oni2avi.cpp –

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