2012-11-12 39 views
1

我寫了一個簡單的kinect應用程序,我正在訪問深度值以檢測某些對象。我使用下面的代碼來獲取深度值如何獲得在深度流中選擇的ROI的RGB值

depth = NuiDepthPixelToDepth(pBufferRun); 

這會給我每個像素的深度值。現在我想要查看圖像的一個區域,並獲取相應區域的RGB攝像機值。

我不知道什麼:

  • 我需要開一個彩色圖像流?
  • 還是僅僅將深度轉換爲彩色就足夠了?
  • 如何使用NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution

我很好用最簡單的解決方案,我有一個深度框架和一個顏色框架,以便我可以選擇一個ROI與opencv,然後相應地裁剪顏色框架。

回答

2
  • 我需要打開彩色圖像流嗎?

是的。您可以在不打開流的情況下獲取彩色框架中的座標,但是您將無法對它們執行任何有用的操作,因爲您不需要索引顏色數據!

  • 還是僅僅將深度轉換爲彩色就足夠了?

將距離轉換爲顏色沒有意義。您需要兩個圖像流和一個座標轉換功能。

  • 如何使用NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution?

這是一個非常有文件記載的功能。請看看NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution,因爲函數參數和文檔實際上是有意義的!深度值和深度座標(x,y)在RGB(x,y)座標中。簡單。

要在某些給定座標處獲取RGB數據,必須先使用NuiImageStreamGetNextFrame獲取RGB幀,以獲取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,例如,測試哪一個實際返回應該是瑣碎)

+0

我不明白'NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution':這個函數只會返回相應深度框架的顏色框架的X/Y座標。但我也想獲得顏色信息。我如何獲得?你有沒有例子? – memyself

+0

@memyself那麼,你可以直接從彩色圖像獲取RGB值,對吧?您可以使用RGB流上的NuiImageStreamGetNextFrame來獲取顏色框,然後使用pFrameTexture-> LockRect來獲取RGB緩衝區。它存儲爲一個正常的每像素32位XRGB圖像 – Rook

+0

我明白如何抓取RGB緩衝區,但我不知道如何訪問位置x,y處每個通道的像素值。 – memyself