0
votes

I'm trying to make an app using Kinect (OpenNI), processing the image (OpenCV) with a GUI.

I tested de OpenNI+OpenCV and OpenCV+Qt

Normally when we use OpenCV+Qt we can make a QWidget to show the content of the camera (VideoCapture) .. Capture a frame and update this querying for new frames to device.

With OpenNI and OpenCV i see examples using a for cycle to pull data from Kinect Sensors (image, depth) , but i don't know how to make this pulling routing mora straightforward. I mean, similar to the OpenCV frame querying.

The idea is embed in a QWidget the images captured from Kinect. The QWidget will have (for now) 2 buttons "Start Kinect" and "Quit" ..and below the Painting section to show the data captured.

Any thoughs?

1

1 Answers

0
votes

You can try the QTimer class to query the kinect at fixed time intervals. In my application I use the code below.

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();

Then to query the frame you can use the label widget. I'm posting an example code below:

// 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));