OpenniGrabber :: OpenniGrabber(OpenniDriver& driver, const std::string& camera_serial) :
    m_driver(driver),
    m_camera_id(-1),
    m_camera_serial(camera_serial),
    m_subsampling_factor(1),
    m_need_pose_to_calibrate(false),
    m_max_num_users(15),
    m_body_event_detector(0),
    m_high_resolution(false),
    m_mirrored(false),
    m_custom_bayer_decoding(false),
    m_xml_config_file(DEFAULT_XML_CONFIG_FILE),
    m_track_users(true),
    m_get_infrared(false),
    m_has_rgb(true)
{
    for (size_t i = 0; i < driver.numDevices(); ++i)
    {
        if (driver.deviceInfo(i).serial == camera_serial)
        {
            m_camera_id = i;
            break;
        }
    }

    if (m_camera_id < 0)
    {
        ntk_throw_exception("Could not find any device with serial " + camera_serial);
    }

    setDefaultBayerMode();
}
int main()
{
    ntk::ntk_debug_level = 1;
    OpenniDriver driver;
    ntk_dbg_print(driver.numDevices(), 1);

    OpenniGrabber grabber1(driver, 0);
    OpenniGrabber grabber2(driver, 1);

    grabber1.connectToDevice();
    grabber2.connectToDevice();

    grabber1.start();
    grabber2.start();

    RGBDImage image1, image2;
    OpenniRGBDProcessor post_processor;

    while (true)
    {
      // Wait for a new frame, get a local copy and postprocess it.
      grabber1.waitForNextFrame();
      grabber1.copyImageTo(image1);

      grabber2.waitForNextFrame();
      grabber2.copyImageTo(image2);
      post_processor.processImage(image2);

      cv::Mat1b debug_depth_img1 = normalize_toMat1b(image1.depth());
      cv::Mat1b debug_depth_img2 = normalize_toMat1b(image2.depth());

      cv::Mat3b debug_color_img1 = image1.mappedRgb();
      cv::Mat3b debug_color_img2 = image2.mappedRgb();

      cv::Mat3b debug_users1;
      cv::Mat3b debug_users2;
      image1.fillRgbFromUserLabels(debug_users1);
      image2.fillRgbFromUserLabels(debug_users2);

      imshow("depth1", debug_depth_img1);
      imshow("color1", debug_color_img1);
      imshow("users1", debug_users1);

      imshow("depth2", debug_depth_img2);
      imshow("color2", debug_color_img2);
      imshow("users2", debug_users2);
      cv::waitKey(10);
    }
}
void *kinect_reader(void *threadid)
{
    long tid;
    int count = 0;
    tid = (long) threadid;
    cout << "Thread for kinect reader n. " << tid << " started" << endl;


    int num_dev = ni_driver.numDevices();

#if 1
    if (num_dev < NUM_KINECTS) {
	{
	    while (true) {
		Sleep(1000);
		cout << "Error: Less than two Kinect were detected (" <<
		    ni_driver.numDevices() << ") for tid:" << tid << endl;
	    }
	}
    }
#endif

    OpenniGrabber *grabber = new OpenniGrabber(ni_driver, 0);

    grabber->setTrackUsers(false);
    grabber->connectToDevice();
    grabber->start();

    cout << "Before mesh generator" << endl;
    // Mesh generator
    MeshGenerator *mesh_generator = new MeshGenerator();
    mesh_generator->setMeshType(MeshGenerator::PointCloudMesh);

    RGBDImage image;
    while (true) {
	count++;
	grabber->waitForNextFrame();
	cout << "!" << tid;
	lock(tid);
	// got the frame
	grabber->copyImageTo(curr_frames[tid].image);
	curr_frames[tid].processed = false;
	unlock(tid);
    }
}