5

kinectセンサーを使ったプロジェクトでopenNIを使用しています。デプスマップで指定されたユーザーのピクセルに色を付けたいのですが。今、私は白から黒に変わるピクセルを持っていますが、私は赤から黒になりたいです。アルファブレンディングを試しましたが、(addWeightを使用して)赤+白=ピンクを追加したため、ピンクから黒までのピクセルが得られました。

これは私の実際のコードです:

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 :: Matを返し、device.getUserMask()はユーザーピクセル(白いピクセルのみ)を含むcv::Matを返します。

いくつかのアドバイス?

編集:もう1つ:サミーの答えのおかげで私はそれをしました。しかし実際には、0から255までの値ではなく、(たとえば)123から220までの値があります。

単純なforループを介して最小値と最大値を見つけます(より良い方法はありますか?)。値をmin-maxから0-255にマップするにはどうすればよいですか?

4

2 に答える 2

5

まず、OpenCV のデフォルトのカラー フォーマットは RGB ではなく BGR です。したがって、赤い画像を作成するためのコードは次のようになります。

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

赤から黒へのカラー マップの場合、アルファ ブレンディングの代わりに要素ごとの乗算を使用できます。

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

を使用して、行列 M の最小値と最大値を見つけることができます。

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

次に、minValue を減算し、係数でスケーリングできます

double factor = 255.0/(maxVal - minVal);    
 M = factor*(M -minValue)
于 2012-05-21T18:15:33.213 に答える
3

ちょっと不器用で遅いかもしれませんが、レイヤーを分割し、red_body (3 ではなく 1 チャンネルの Mat にします) を red チャンネルにコピーし、それらをレイヤーにマージしますか?

reshape を使用すると、同じ効果が得られますが、(その場で) はるかに高速です。

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
于 2012-05-21T17:20:53.877 に答える