Back up and running, now with OpenNI rather than libfreenect.

This commit is contained in:
Andrzej Kapolka 2013-06-28 17:31:49 -07:00
parent ea9566596a
commit b4b09b0070
3 changed files with 48 additions and 20 deletions

View file

@ -96,7 +96,7 @@ find_package(NITE)
# let the source know that we have OpenNI/NITE for Kinect # let the source know that we have OpenNI/NITE for Kinect
if (OPENNI_FOUND AND NITE_FOUND) if (OPENNI_FOUND AND NITE_FOUND)
add_definitions(-DHAVE_NITE) add_definitions(-DHAVE_OPENNI)
include_directories(SYSTEM ${OPENNI_INCLUDE_DIRS} ${NITE_INCLUDE_DIRS}) include_directories(SYSTEM ${OPENNI_INCLUDE_DIRS} ${NITE_INCLUDE_DIRS})
target_link_libraries(${TARGET_NAME} ${OPENNI_LIBRARIES} ${NITE_LIBRARIES}) target_link_libraries(${TARGET_NAME} ${OPENNI_LIBRARIES} ${NITE_LIBRARIES})
endif (OPENNI_FOUND AND NITE_FOUND) endif (OPENNI_FOUND AND NITE_FOUND)

View file

@ -210,7 +210,7 @@ void Webcam::setFrame(const Mat& frame, int format, const Mat& depth, const Rota
QTimer::singleShot(qMax((int)remaining / 1000, 0), _grabber, SLOT(grabFrame())); QTimer::singleShot(qMax((int)remaining / 1000, 0), _grabber, SLOT(grabFrame()));
} }
FrameGrabber::FrameGrabber() : _capture(0), _searchWindow(0, 0, 0, 0) { FrameGrabber::FrameGrabber() : _initialized(false), _capture(0), _searchWindow(0, 0, 0, 0) {
} }
FrameGrabber::~FrameGrabber() { FrameGrabber::~FrameGrabber() {
@ -224,24 +224,38 @@ void FrameGrabber::reset() {
} }
void FrameGrabber::grabFrame() { void FrameGrabber::grabFrame() {
if (_capture == 0 && !init()) { if (!(_initialized || init())) {
return; return;
} }
int format = GL_BGR; int format = GL_BGR;
IplImage* image = cvQueryFrame(_capture); Mat frame;
if (image == 0) {
// try again later
QMetaObject::invokeMethod(this, "grabFrame", Qt::QueuedConnection);
return;
}
// make sure it's in the format we expect #ifdef HAVE_OPENNI
if (image->nChannels != 3 || image->depth != IPL_DEPTH_8U || image->dataOrder != IPL_DATA_ORDER_PIXEL || if (_depthGenerator.IsValid()) {
image->origin != 0) { _xnContext.WaitAnyUpdateAll();
printLog("Invalid webcam image format.\n"); frame = Mat(_imageMetaData.YRes(), _imageMetaData.XRes(), CV_8UC3, (void*)_imageGenerator.GetImageMap());
return; format = GL_RGB;
Mat depth = Mat(_depthMetaData.YRes(), _depthMetaData.XRes(), CV_16UC1, (void*)_depthGenerator.GetDepthMap());
depth.convertTo(_grayDepthFrame, CV_8UC1, 256.0 / 2048.0);
}
#endif
if (frame.empty()) {
IplImage* image = cvQueryFrame(_capture);
if (image == 0) {
// try again later
QMetaObject::invokeMethod(this, "grabFrame", Qt::QueuedConnection);
return;
}
// make sure it's in the format we expect
if (image->nChannels != 3 || image->depth != IPL_DEPTH_8U || image->dataOrder != IPL_DATA_ORDER_PIXEL ||
image->origin != 0) {
printLog("Invalid webcam image format.\n");
return;
}
frame = image;
} }
Mat frame = image;
// if we don't have a search window (yet), try using the face cascade // if we don't have a search window (yet), try using the face cascade
int channels = 0; int channels = 0;
@ -274,10 +288,12 @@ void FrameGrabber::grabFrame() {
_searchWindow = faceRect.boundingRect(); _searchWindow = faceRect.boundingRect();
} }
QMetaObject::invokeMethod(Application::getInstance()->getWebcam(), "setFrame", QMetaObject::invokeMethod(Application::getInstance()->getWebcam(), "setFrame",
Q_ARG(cv::Mat, frame), Q_ARG(int, format), Q_ARG(cv::Mat, Mat()), Q_ARG(cv::RotatedRect, faceRect)); Q_ARG(cv::Mat, frame), Q_ARG(int, format), Q_ARG(cv::Mat, _grayDepthFrame), Q_ARG(cv::RotatedRect, faceRect));
} }
bool FrameGrabber::init() { bool FrameGrabber::init() {
_initialized = true;
// load our face cascade // load our face cascade
switchToResourcesParentIfRequired(); switchToResourcesParentIfRequired();
if (!_faceCascade.load("resources/haarcascades/haarcascade_frontalface_alt.xml")) { if (!_faceCascade.load("resources/haarcascades/haarcascade_frontalface_alt.xml")) {
@ -286,9 +302,15 @@ bool FrameGrabber::init() {
} }
// first try for a Kinect // first try for a Kinect
#ifdef HAVE_NITE #ifdef HAVE_OPENNI
_xnContext.Init(); _xnContext.Init();
if (_depthGenerator.Create(_xnContext) == XN_STATUS_OK && _imageGenerator.Create(_xnContext) == XN_STATUS_OK) {
_depthGenerator.GetMetaData(_depthMetaData);
_imageGenerator.SetPixelFormat(XN_PIXEL_FORMAT_RGB24);
_imageGenerator.GetMetaData(_imageMetaData);
_xnContext.StartGeneratingAll();
return true;
}
#endif #endif
// next, an ordinary webcam // next, an ordinary webcam

View file

@ -17,7 +17,7 @@
#include <opencv2/opencv.hpp> #include <opencv2/opencv.hpp>
#ifdef HAVE_NITE #ifdef HAVE_OPENNI
#include <XnCppWrapper.h> #include <XnCppWrapper.h>
#endif #endif
@ -92,6 +92,7 @@ private:
bool init(); bool init();
void updateHSVFrame(const cv::Mat& frame, int format); void updateHSVFrame(const cv::Mat& frame, int format);
bool _initialized;
CvCapture* _capture; CvCapture* _capture;
cv::CascadeClassifier _faceCascade; cv::CascadeClassifier _faceCascade;
cv::Mat _hsvFrame; cv::Mat _hsvFrame;
@ -99,9 +100,14 @@ private:
cv::SparseMat _histogram; cv::SparseMat _histogram;
cv::Mat _backProject; cv::Mat _backProject;
cv::Rect _searchWindow; cv::Rect _searchWindow;
cv::Mat _grayDepthFrame;
#ifdef HAVE_NITE #ifdef HAVE_OPENNI
xn::Context _xnContext; xn::Context _xnContext;
xn::DepthGenerator _depthGenerator;
xn::ImageGenerator _imageGenerator;
xn::DepthMetaData _depthMetaData;
xn::ImageMetaData _imageMetaData;
#endif #endif
}; };