mirror of
https://github.com/overte-org/overte.git
synced 2025-04-25 20:36:38 +02:00
Back up and running, now with OpenNI rather than libfreenect.
This commit is contained in:
parent
ea9566596a
commit
b4b09b0070
3 changed files with 48 additions and 20 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue