2012-05-21 96 views
4

我使用openNI對於一些項目,Kinect感應器的灰度圖像。我想給深度圖給出的用戶像素着色。現在我有從白色到黑色的像素,但我想從紅色到黑色。我嘗試過與alpha混合,但我的結果只是我有從粉紅色到黑色的像素,因爲我添加了(使用addWeight)紅色+白色=粉紅色。色彩搭配OpenCV的

這是我的實際代碼:

layers = device.getDepth().clone(); 
cvtColor(layers, layers, CV_GRAY2BGR); 

Mat red = Mat(240,320, CV_8UC3, Scalar(255,0,0)); 
Mat red_body; // = Mat::zeros(240,320, CV_8UC3); 
red.copyTo(red_body, device.getUserMask()); 

addWeighted(red_body, 0.8, layers, 0.5, 0.0, layers); 

其中device.getDepth()返回一個CV ::墊與深度圖和device.getUserMask()返回一個CV ::墊與用戶像素(僅限白色像素)

一些建議嗎?

編輯: 一兩件事: 感謝sammy answer我已經做到了。但實際上我沒有完全從0到255的值,但是來自(例如)123-220。

我要去尋找最小值和最大值通過一個簡單的for循環(有沒有更好的辦法?),以及如何將我的值在最小最大映射到0-255?

+0

你有沒有-unselect- Sammy的答案?這是一個非常好的答案。我不知道你想如何着色你的灰度圖像。 Mul是一個不錯的解決方案。我認爲在你的問題中增加另一部分是非常粗魯的,取消選擇以前正確的答案,並等待更多。更不用說在參考文獻中很容易查看max-min和scaling。 –

回答

4

首先,OpenCV的默認顏色格式是BGR不是RGB。所以,你創建的紅色圖像的代碼應該是

Mat red = Mat(240,320, CV_8UC3, Scalar(0,0,255)); 

對於紅色到黑色的地圖,你可以使用元素方式乘法,而不是alpha混合

Mat out = red_body.mul(layers, 1.0/255); 

,你可以找到最小值和最大值使用

double minVal, maxVal; 
minMaxLoc(M, &minVal, &maxVal, 0, 0); 

矩陣M ^然後,您可以減去是minvalue和規模有一個因素

double factor = 255.0/(maxVal - minVal);  
M = factor*(M -minValue) 
+0

我也想知道那BGR。但nkint說結果是粉紅色的。去搞清楚。 –

+0

是的,我使用的CV ::墊,但我包他們GL紋理繪製..好..其實框架我使用做 – nkint

+0

效果很好!另一個小東西:我已經更新了這個問題。 – nkint

2

有點笨拙和緩慢,但也許拆分圖層,複製red_body(使其成爲一個通道墊,而不是3)到紅色通道,將它們合併回層?

獲得同樣的效果,但要快得多(到位)與重塑:

layers = device.getDepth().clone(); 
cvtColor(layers, layers, CV_GRAY2BGR); 

Mat red = Mat(240,320, CV_8UC1, Scalar(255)); // One channel 
Mat red_body; 
red.copyTo(red_body, device.getUserMask()); 

Mat flatLayer = layers.reshape(1,240*320); // presumed dimensions of layer 
red_body.reshape(0,240*320).copyTo(flatLayer.col(0)); 

// layers now has the red from red_body 
+0

沒有新的編輯? – nkint