9

私は Kinect と OpenCV を使用しています (私は c++ を使用しています)。RGB 画像と深度画像の両方を取得できます。RGB画像では、キャニーを使用して(グレースケールに変換した後)ぼかして、いつものように「再生」できますが、深度画像では同じことはできません。深度画像で何かをしたいたびに、例外が発生しました。

深度画像を取得する次のコードがあります。

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1 ); 
CvMat* imageMetersMat = cvCreateMat(480, 640, CV_16UC1 );
IplImage *kinectDepthImage = cvCreateImage( cvSize(640,480),16,1); 

const XnDepthPixel* pDepthMap = depth.GetDepthMap();

for (int y=0; y<XN_VGA_Y_RES; y++){ 
            for(int x=0;x<XN_VGA_X_RES;x++){ 
                depthMetersMat->data.s[y * XN_VGA_X_RES + x ] = 10 * pDepthMap[y * XN_VGA_X_RES + x]; 
          }
}

cvGetImage(depthMetersMat, kinectDepthImage);

問題は、kinectDepthImage で何もできないことです。グレースケールに変換してからキャニーを使用しようとしましたが、変換方法がわかりません。

基本的には深度画像にキャニーとラプラシアンを適用したいと思います。

4

5 に答える 5

5

問題は、cvGetImage からの出力が 16 ビット深度であるのに対し、canny は 8 ビットを必要とするため、次のように 8 ビットに変換する必要があることでした。

cvConvertScale(depthMetersMat, kinectDepthImage8, 1.0/256.0, 0);
于 2011-04-02T17:49:47.437 に答える
3

新しい OpenCV Api では、古いイメージ タイプの代わりに Mat を使用することが奨励されています。OpenCV で OpenNI 深度メタデータを使用するための現在のコードは次のようになります。

Mat depthMat16UC1(width, height, CV_16UC1, (void*) g_DepthMD.Data()); 
Mat depthMat8UC1;
depthMat16UC1.convertTo(depthMat8UC1, CV_8U, 1.0/256.0);
于 2012-05-19T17:35:40.380 に答える
0

Verify below link code ... could give you valuable information. NOTE: Its not my code, may give the result you require. comment the //cvCvtColor(rgbimg,rgbimg,CV_RGB2BGR);

http://pastebin.com/e5kHzs84

Regards Nagaraju

于 2011-04-20T07:17:12.710 に答える
0

OpenNI を使用している場合、コンテキスト、運用ノードを作成し、データの生成を開始しましたか? おそらくそれはあなたの問題です..

于 2012-07-12T15:29:57.403 に答える
0

sizeof(XnDepthPixel) とは?

cvCreateImageHeaderを使用してから、XnDepth Image でcvSetDataを実行してみてください

于 2011-04-02T09:05:12.910 に答える