0

Kinect (OpenNI) を使用して、画像 (OpenCV) を GUI で処理するアプリを作成しようとしています。

OpenNI+OpenCV と OpenCV+Qt をテストしました

通常、OpenCV+Qt を使用すると、QWidget を作成してカメラ (VideoCapture) のコンテンツを表示できます。フレームをキャプチャし、デバイスへの新しいフレームのクエリを更新します。

OpenNI と OpenCV を使用して、for サイクルを使用して Kinect センサー (画像、深さ) からデータをプルする例を見ましたが、このプル ルーティング モードを簡単にする方法がわかりません。つまり、OpenCV フレームのクエリに似ています。

アイデアは、Kinect からキャプチャされた画像を QWidget に埋め込むことです。QWidget には (今のところ) [Kinect を開始] と [終了] の 2 つのボタンがあり、[ペイント] セクションの下にキャプチャされたデータが表示されます。

何か考えはありますか?

4

1 に答える 1

0

QTimer クラスを試して、一定の時間間隔で kinect にクエリを実行できます。私のアプリケーションでは、以下のコードを使用します。

void UpperBodyGestures::refreshUsingTimer()
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(MainEventFunction()));
    timer->start(30);
}

void UpperBodyGestures::on_pushButton_Kinect_clicked()
{
    InitKinect();
    ui.pushButton_Kinect->setEnabled(false);
}


// modify the main function to call refreshUsingTimer function

    UpperBodyGestures w;
    w.show();
    w.refreshUsingTimer();
    return a.exec();

フレームをクエリするには、ラベル ウィジェットを使用できます。以下にサンプルコードを掲載しています。

// Query the depth data from Openni
const XnDepthPixel* pDepth = depthMD.Data();
// Convert it to opencv for manipulation etc
cv::Mat DepthBuf(480,640,CV_16UC1,(unsigned char*)g_Depth);
// Normalize Depth image to 0-255 range (cant remember max range number so assuming it as 10k)
DepthBuf = DepthBuf / 10000 *255; 
DepthBuf.convertTo(DepthBuf,CV_8UC1);
// Convert opencv image to a Qimage object 
QImage qimage((const unsigned char*)DepthBuf.data, DepthBuf.size().width, DepthBuf.size().height, DepthBuf.step, QImage::Format_RGB888);        
// Display the Qimage in the defined mylabel object
ui.myLabel->setPixmap(pixmap.fromImage(qimage,0).scaled(QSize(300,300), Qt::KeepAspectRatio, Qt::FastTransformation));
于 2011-12-30T11:44:09.460 に答える