2012-05-21 3 views
4

나는 kinect 센서가있는 프로젝트에서 openNI를 사용하고 있습니다. 나는 깊이 맵과 함께 제공된 사용자 픽셀을 채색하고 싶습니다. 이제 저는 흰색에서 검은 색으로 변하는 픽셀을 가지고 있지만 빨강 색에서 검정색으로 변합니다. 나는 알파 블렌딩을 시도했지만 내 결과는 내가 addWeight를 사용하여 red + white = pink를 추가했기 때문에 핑크색에서 검은 색까지 픽셀을 가진다는 것입니다.그레이 스케일 이미지를 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()가 이력서 :: 매트 깊이 맵과 device.getUserMask()과를 반환

는 이력서 :: 매트 사용자 픽셀 (흰색 만 반환 픽셀)

약간의 조언?

편집 : 한 가지 더 : 덕분에 sammy answer했습니다. 하지만 실제로 0에서 255까지의 값은 없지만 (예 : 123-220).

간단한 for 루프를 통해 최소값과 최대 값을 찾을 수 있습니다 (더 좋은 방법이 있습니까?). 그리고 최소값에서 최대 값을 0-255로 매핑하는 방법은 무엇입니까?

+0

당신은 -unselect- 새미의 대답을 했습니까 ?? 그것은 아주 좋은 대답이었습니다. 그레이 스케일 이미지를 채색하려는 방법을 이해하지 못했습니다. Mul은 훌륭한 솔루션입니다. 귀하의 질문에 다른 부분을 추가하고, 이전의 정답을 선택 취소하고, 더 기다리는 것이 매우 무례하다고 생각합니다. 언급 된 max-min 및 scaling은 참조에서 쉽게 찾을 수 있습니다. –

답변

4

먼저, OpenCV의의 기본 색상 형식이 RGB BGR 없습니다. 그래서, 빨간색 이미지를 만드는 코드는 블랙 컬러 맵에 빨강, 당신은 당신은 최소 및 최대 값을 찾을 수 있습니다

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

을 혼합 알파 대신 요소 현명한 곱셈을 사용할 수 있습니다 들어

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

을해야한다

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

를 사용하여 행렬 M의 그 다음 요인으로 MINVALUE 및 스케일을 뺄 수

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

나는 그 BGR에 대해서 너무 궁금해했다. 그러나 nkint는 그 결과가 분홍색이라고 말했습니다. 그림을 이동. –

+0

그래, 나는 cv :: Mat를 사용하고있다. 그러나 그림을 그릴 때 gl 텍스쳐를 감쌌다. .. 실제로 프레임 워크를 사용하고있다. – nkint

+0

잘 동작한다! 또 다른 작은 것들 : 나는 질문을 업데이 트했습니다. – nkint

2

다소 어색하고 느린 편이지만, 레이어를 분할하여 빨간색 채널에 red_body (3 개의 채널이 아닌 1 개의 채널 매트로 만듭니다)를 복사하여 레이어로 다시 병합 할 수 있습니까?

는 모양 변경과 같은 효과를 얻을 수 있지만, 훨씬 더 빨리 (장소) :

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

관련 문제