Build OpenNI/NITE into interface if available.

This commit is contained in:
Andrzej Kapolka 2013-06-28 16:47:08 -07:00
parent 884f14dca1
commit ea9566596a
5 changed files with 126 additions and 84 deletions

View file

@ -0,0 +1,44 @@
# Find the NITE library
#
# You must provide an NITE_ROOT_DIR which contains lib and include directories
#
# Once done this will define
#
# NITE_FOUND - system found NITE
# NITE_INCLUDE_DIRS - the NITE include directory
# NITE_LIBRARIES - Link this to use NITE
#
# Created on 6/28/2013 by Andrzej Kapolka
# Copyright (c) 2013 High Fidelity
#
if (NITE_LIBRARIES AND NITE_INCLUDE_DIRS)
# in cache already
set(NITE_FOUND TRUE)
else (NITE_LIBRARIES AND NITE_INCLUDE_DIRS)
find_path(NITE_INCLUDE_DIRS XnVNite.h /usr/include/nite)
if (APPLE)
find_library(NITE_LIBRARIES libXnVNite_1_5_2.dylib /usr/lib)
elseif (UNIX)
find_library(NITE_LIBRARIES libXnVNite_1_5_2.so /usr/lib)
endif ()
if (NITE_INCLUDE_DIRS AND NITE_LIBRARIES)
set(NITE_FOUND TRUE)
endif (NITE_INCLUDE_DIRS AND NITE_LIBRARIES)
if (NITE_FOUND)
if (NOT NITE_FIND_QUIETLY)
message(STATUS "Found NITE: ${NITE_LIBRARIES}")
endif (NOT NITE_FIND_QUIETLY)
else (NITE_FOUND)
if (NITE_FIND_REQUIRED)
message(FATAL_ERROR "Could not find NITE")
endif (NITE_FIND_REQUIRED)
endif (NITE_FOUND)
# show the NITE_INCLUDE_DIRS and NITE_LIBRARIES variables only in the advanced view
mark_as_advanced(NITE_INCLUDE_DIRS NITE_LIBRARIES)
endif (NITE_LIBRARIES AND NITE_INCLUDE_DIRS)

View file

@ -0,0 +1,44 @@
# Find the OpenNI library
#
# You must provide an OPENNI_ROOT_DIR which contains lib and include directories
#
# Once done this will define
#
# OPENNI_FOUND - system found OpenNI
# OPENNI_INCLUDE_DIRS - the OpenNI include directory
# OPENNI_LIBRARIES - Link this to use OpenNI
#
# Created on 6/28/2013 by Andrzej Kapolka
# Copyright (c) 2013 High Fidelity
#
if (OPENNI_LIBRARIES AND OPENNI_INCLUDE_DIRS)
# in cache already
set(OPENNI_FOUND TRUE)
else (OPENNI_LIBRARIES AND OPENNI_INCLUDE_DIRS)
find_path(OPENNI_INCLUDE_DIRS XnOpenNI.h /usr/include/ni)
if (APPLE)
find_library(OPENNI_LIBRARIES libOpenNI.dylib /usr/lib)
elseif (UNIX)
find_library(OPENNI_LIBRARIES libOpenNI.so /usr/lib)
endif ()
if (OPENNI_INCLUDE_DIRS AND OPENNI_LIBRARIES)
set(OPENNI_FOUND TRUE)
endif (OPENNI_INCLUDE_DIRS AND OPENNI_LIBRARIES)
if (OPENNI_FOUND)
if (NOT OPENNI_FIND_QUIETLY)
message(STATUS "Found OpenNI: ${OPENNI_LIBRARIES}")
endif (NOT OPENNI_FIND_QUIETLY)
else (OPENNI_FOUND)
if (OPENNI_FIND_REQUIRED)
message(FATAL_ERROR "Could not find OpenNI")
endif (OPENNI_FIND_REQUIRED)
endif (OPENNI_FOUND)
# show the OPENNI_INCLUDE_DIRS and OPENNI_LIBRARIES variables only in the advanced view
mark_as_advanced(OPENNI_INCLUDE_DIRS OPENNI_LIBRARIES)
endif (OPENNI_LIBRARIES AND OPENNI_INCLUDE_DIRS)

View file

@ -91,6 +91,15 @@ find_package(Leap)
find_package(OpenCV)
find_package(ZLIB)
find_package(UVCCameraControl)
find_package(OpenNI)
find_package(NITE)
# let the source know that we have OpenNI/NITE for Kinect
if (OPENNI_FOUND AND NITE_FOUND)
add_definitions(-DHAVE_NITE)
include_directories(SYSTEM ${OPENNI_INCLUDE_DIRS} ${NITE_INCLUDE_DIRS})
target_link_libraries(${TARGET_NAME} ${OPENNI_LIBRARIES} ${NITE_LIBRARIES})
endif (OPENNI_FOUND AND NITE_FOUND)
# include headers for interface and InterfaceConfig.
include_directories(

View file

@ -210,17 +210,11 @@ void Webcam::setFrame(const Mat& frame, int format, const Mat& depth, const Rota
QTimer::singleShot(qMax((int)remaining / 1000, 0), _grabber, SLOT(grabFrame()));
}
FrameGrabber::FrameGrabber() : _capture(0), _searchWindow(0, 0, 0, 0), _freenectContext(0) {
FrameGrabber::FrameGrabber() : _capture(0), _searchWindow(0, 0, 0, 0) {
}
FrameGrabber::~FrameGrabber() {
if (_freenectContext != 0) {
freenect_stop_depth(_freenectDevice);
freenect_stop_video(_freenectDevice);
freenect_close_device(_freenectDevice);
freenect_shutdown(_freenectContext);
} else if (_capture != 0) {
if (_capture != 0) {
cvReleaseCapture(&_capture);
}
}
@ -229,51 +223,36 @@ void FrameGrabber::reset() {
_searchWindow = Rect(0, 0, 0, 0);
}
static Mat videoFrame, depthFrame;
static bool gotVideoFrame, gotDepthFrame;
void FrameGrabber::grabFrame() {
if (_capture == 0 && _freenectContext == 0 && !init()) {
if (_capture == 0 && !init()) {
return;
}
int format = GL_BGR;
::gotVideoFrame = ::gotDepthFrame = false;
if (_freenectContext != 0) {
freenect_process_events(_freenectContext);
if (::gotDepthFrame) {
::depthFrame.convertTo(_grayDepth, CV_8UC1, 255.0 / 2047.0);
}
format = GL_RGB;
} else {
IplImage* image = cvQueryFrame(_capture);
if (image != 0) {
// 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;
}
::videoFrame = image;
::gotVideoFrame = true;
}
}
if (!::gotVideoFrame) {
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;
}
Mat frame = image;
// if we don't have a search window (yet), try using the face cascade
int channels = 0;
float ranges[] = { 0, 180 };
const float* range = ranges;
if (_searchWindow.area() == 0) {
vector<Rect> faces;
_faceCascade.detectMultiScale(::videoFrame, faces, 1.1, 6);
_faceCascade.detectMultiScale(frame, faces, 1.1, 6);
if (!faces.empty()) {
_searchWindow = faces.front();
updateHSVFrame(::videoFrame, format);
updateHSVFrame(frame, format);
Mat faceHsv(_hsvFrame, _searchWindow);
Mat faceMask(_mask, _searchWindow);
@ -286,7 +265,7 @@ void FrameGrabber::grabFrame() {
}
RotatedRect faceRect;
if (_searchWindow.area() > 0) {
updateHSVFrame(::videoFrame, format);
updateHSVFrame(frame, format);
calcBackProject(&_hsvFrame, 1, &channels, _histogram, _backProject, &range);
bitwise_and(_backProject, _mask, _backProject);
@ -295,25 +274,7 @@ void FrameGrabber::grabFrame() {
_searchWindow = faceRect.boundingRect();
}
QMetaObject::invokeMethod(Application::getInstance()->getWebcam(), "setFrame",
Q_ARG(cv::Mat, ::videoFrame), Q_ARG(int, format), Q_ARG(cv::Mat, _grayDepth), Q_ARG(cv::RotatedRect, faceRect));
}
const char* FREENECT_LOG_LEVEL_NAMES[] = { "fatal", "error", "warning", "notice", "info", "debug", "spew", "flood" };
static void logCallback(freenect_context* freenectDevice, freenect_loglevel level, const char *msg) {
printLog("Freenect %s: %s\n", FREENECT_LOG_LEVEL_NAMES[level], msg);
}
static freenect_frame_mode freenectVideoMode, freenectDepthMode;
static void depthCallback(freenect_device* freenectDevice, void* depth, uint32_t timestamp) {
::depthFrame = Mat(::freenectDepthMode.height, ::freenectDepthMode.width, CV_16UC1, depth);
::gotDepthFrame = true;
}
static void videoCallback(freenect_device* freenectDevice, void* video, uint32_t timestamp) {
::videoFrame = Mat(::freenectVideoMode.height, ::freenectVideoMode.width, CV_8UC3, video);
::gotVideoFrame = true;
Q_ARG(cv::Mat, frame), Q_ARG(int, format), Q_ARG(cv::Mat, Mat()), Q_ARG(cv::RotatedRect, faceRect));
}
bool FrameGrabber::init() {
@ -325,28 +286,10 @@ bool FrameGrabber::init() {
}
// first try for a Kinect
if (freenect_init(&_freenectContext, 0) >= 0) {
freenect_set_log_level(_freenectContext, FREENECT_LOG_WARNING);
freenect_set_log_callback(_freenectContext, logCallback);
freenect_select_subdevices(_freenectContext, FREENECT_DEVICE_CAMERA);
if (freenect_num_devices(_freenectContext) > 0) {
if (freenect_open_device(_freenectContext, &_freenectDevice, 0) >= 0) {
freenect_set_depth_callback(_freenectDevice, depthCallback);
freenect_set_video_callback(_freenectDevice, videoCallback);
::freenectVideoMode = freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_RGB);
freenect_set_video_mode(_freenectDevice, ::freenectVideoMode);
::freenectDepthMode = freenect_find_depth_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_DEPTH_11BIT);
freenect_set_depth_mode(_freenectDevice, ::freenectDepthMode);
freenect_start_depth(_freenectDevice);
freenect_start_video(_freenectDevice);
return true;
}
}
freenect_shutdown(_freenectContext);
_freenectContext = 0;
}
#ifdef HAVE_NITE
_xnContext.Init();
#endif
// next, an ordinary webcam
if ((_capture = cvCaptureFromCAM(-1)) == 0) {

View file

@ -15,10 +15,12 @@
#include <glm/glm.hpp>
#include <libfreenect.h>
#include <opencv2/opencv.hpp>
#ifdef HAVE_NITE
#include <XnCppWrapper.h>
#endif
#include "InterfaceConfig.h"
class QImage;
@ -97,10 +99,10 @@ private:
cv::SparseMat _histogram;
cv::Mat _backProject;
cv::Rect _searchWindow;
cv::Mat _grayDepth;
freenect_context* _freenectContext;
freenect_device* _freenectDevice;
#ifdef HAVE_NITE
xn::Context _xnContext;
#endif
};
Q_DECLARE_METATYPE(cv::Mat)