11

Kinect と OpenCV を使用しています。私はすでにこのフォーラムを検索していますが、私の問題のようなものは見つかりませんでした。Kinect (16 ビット) から生の深度データを保持し、それを CvMat* に保存してから、それを cvGetImage に渡して、そこから IplImage* を作成します。

CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 );
[...]
cvGetImage(depthMetersMat,temp);

しかし、cvThreshdold を実行して輪郭を見つけるために、この画像で作業する必要があります。これら 2 つの関数は、入力に 8 ビット深度のイメージを必要とします。CvMat* depthMetersMat を 8-bit-depth-CvMat* に変換するにはどうすればよいですか?

4

2 に答える 2

21

@SSteve が提供した答えは、ほとんどうまくいきましたが、への呼び出しはconvertTo、実際に値を 8 ビット範囲にスケーリングするのではなく、上位バイトを切り取ったように見えました。@Sirnino はどの動作が必要かを指定しなかったので、他の誰かがそうしたい場合に備えて、(線形) スケーリングを行うコードを投稿すると思いました。

SSteve の元のコード:

 CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 );  
 cv::Mat m2(depthMetersMat, true);  
 m2.convertTo(m2, CV_8U);

値をスケーリングするには、3 番目のパラメーター (アルファ) としてスケーリング係数 (16 ビットから 8 ビットへのスケーリングの場合は 1/256、または 0.00390625) を呼び出しに追加する必要があります。convertTo

m2.convertTo(m2, CV_8U, 0.00390625);

アルファを乗算した後に各値に追加される 4 番目のパラメーター (デルタ) を追加することもできます。詳細については、ドキュメントを参照してください。

于 2012-05-02T19:57:14.553 に答える
2

これはうまくいくはずです:

CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 );
cv::Mat m2(depthMetersMat, true);
m2.convertTo(m2, CV_8U);

しかし、OpenCV docs によると、CvMat は廃止されています。代わりにマットを使用する必要があります。

于 2011-08-02T16:07:12.077 に答える