From b62d2d85c3e4062c163e353fc5cbfe4bd4da6978 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 11 Jul 2013 10:28:09 -0700 Subject: [PATCH 1/4] Let's try actually releasing the camera when we turn it off. --- interface/src/Webcam.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/interface/src/Webcam.cpp b/interface/src/Webcam.cpp index 6c7006c5f4..5a3fadf9b1 100644 --- a/interface/src/Webcam.cpp +++ b/interface/src/Webcam.cpp @@ -32,8 +32,8 @@ int rotatedRectMetaType = qRegisterMetaType("cv::RotatedRect"); Webcam::Webcam() : _enabled(false), _active(false), _frameTextureID(0), _depthTextureID(0) { // the grabber simply runs as fast as possible - _grabber = new FrameGrabber(); - _grabber->moveToThread(&_grabberThread); + //_grabber = new FrameGrabber(); + //_grabber->moveToThread(&_grabberThread); } void Webcam::setEnabled(bool enabled) { @@ -41,6 +41,8 @@ void Webcam::setEnabled(bool enabled) { return; } if ((_enabled = enabled)) { + _grabber = new FrameGrabber(); + _grabber->moveToThread(&_grabberThread); _grabberThread.start(); _startTimestamp = 0; _frameCount = 0; @@ -50,7 +52,9 @@ void Webcam::setEnabled(bool enabled) { QMetaObject::invokeMethod(_grabber, "grabFrame"); } else { + _grabber->deleteLater(); _grabberThread.quit(); + _grabber = 0; _active = false; } } @@ -145,7 +149,9 @@ Webcam::~Webcam() { _grabberThread.quit(); _grabberThread.wait(); - delete _grabber; + if (_grabber != 0) { + delete _grabber; + } } void Webcam::setFrame(const Mat& frame, int format, const Mat& depth, const RotatedRect& faceRect, const JointVector& joints) { @@ -268,6 +274,7 @@ FrameGrabber::FrameGrabber() : _initialized(false), _capture(0), _searchWindow(0 FrameGrabber::~FrameGrabber() { if (_capture != 0) { + qDebug() << "Releasing."; cvReleaseCapture(&_capture); } } From cf7408505fc4eac5d7c4a52af21c9c6d9996823d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 11 Jul 2013 10:53:51 -0700 Subject: [PATCH 2/4] Shut down the webcam when it's turned off, but don't delete the grabber (since it has expensive-to-init state like the face cascade). --- interface/src/Webcam.cpp | 28 +++++++++++++++++----------- interface/src/Webcam.h | 1 + 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/interface/src/Webcam.cpp b/interface/src/Webcam.cpp index 9c09d7f9c8..7aa3c6ce32 100644 --- a/interface/src/Webcam.cpp +++ b/interface/src/Webcam.cpp @@ -32,8 +32,8 @@ int rotatedRectMetaType = qRegisterMetaType("cv::RotatedRect"); Webcam::Webcam() : _enabled(false), _active(false), _frameTextureID(0), _depthTextureID(0) { // the grabber simply runs as fast as possible - //_grabber = new FrameGrabber(); - //_grabber->moveToThread(&_grabberThread); + _grabber = new FrameGrabber(); + _grabber->moveToThread(&_grabberThread); } void Webcam::setEnabled(bool enabled) { @@ -41,8 +41,6 @@ void Webcam::setEnabled(bool enabled) { return; } if ((_enabled = enabled)) { - _grabber = new FrameGrabber(); - _grabber->moveToThread(&_grabberThread); _grabberThread.start(); _startTimestamp = 0; _frameCount = 0; @@ -52,9 +50,8 @@ void Webcam::setEnabled(bool enabled) { QMetaObject::invokeMethod(_grabber, "grabFrame"); } else { - _grabber->deleteLater(); + QMetaObject::invokeMethod(_grabber, "shutdown"); _grabberThread.quit(); - _grabber = 0; _active = false; } } @@ -273,10 +270,7 @@ FrameGrabber::FrameGrabber() : _initialized(false), _capture(0), _searchWindow(0 } FrameGrabber::~FrameGrabber() { - if (_capture != 0) { - qDebug() << "Releasing."; - cvReleaseCapture(&_capture); - } + shutdown(); } #ifdef HAVE_OPENNI @@ -373,6 +367,14 @@ void FrameGrabber::reset() { #endif } +void FrameGrabber::shutdown() { + if (_capture != 0) { + cvReleaseCapture(&_capture); + _capture = 0; + } + _initialized = false; +} + void FrameGrabber::grabFrame() { if (!(_initialized || init())) { return; @@ -427,6 +429,10 @@ void FrameGrabber::grabFrame() { #endif if (frame.empty()) { + if (_capture == 0) { + // reinitialize + + } IplImage* image = cvQueryFrame(_capture); if (image == 0) { // try again later @@ -482,7 +488,7 @@ bool FrameGrabber::init() { // load our face cascade switchToResourcesParentIfRequired(); - if (!_faceCascade.load("resources/haarcascades/haarcascade_frontalface_alt.xml")) { + if (_faceCascade.empty() && !_faceCascade.load("resources/haarcascades/haarcascade_frontalface_alt.xml")) { printLog("Failed to load Haar cascade for face tracking.\n"); return false; } diff --git a/interface/src/Webcam.h b/interface/src/Webcam.h index c39f8660da..4bc557f4fb 100644 --- a/interface/src/Webcam.h +++ b/interface/src/Webcam.h @@ -94,6 +94,7 @@ public: public slots: void reset(); + void shutdown(); void grabFrame(); private: From b23875a952921e0295e949d230ab0d691fae39a3 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 11 Jul 2013 11:10:14 -0700 Subject: [PATCH 3/4] Make sure we shutdown before quitting. --- interface/src/Webcam.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Webcam.cpp b/interface/src/Webcam.cpp index 7aa3c6ce32..aa161da367 100644 --- a/interface/src/Webcam.cpp +++ b/interface/src/Webcam.cpp @@ -51,7 +51,6 @@ void Webcam::setEnabled(bool enabled) { } else { QMetaObject::invokeMethod(_grabber, "shutdown"); - _grabberThread.quit(); _active = false; } } @@ -146,9 +145,7 @@ Webcam::~Webcam() { _grabberThread.quit(); _grabberThread.wait(); - if (_grabber != 0) { - delete _grabber; - } + delete _grabber; } void Webcam::setFrame(const Mat& frame, int format, const Mat& depth, const RotatedRect& faceRect, const JointVector& joints) { @@ -270,7 +267,9 @@ FrameGrabber::FrameGrabber() : _initialized(false), _capture(0), _searchWindow(0 } FrameGrabber::~FrameGrabber() { - shutdown(); + if (_initialized) { + shutdown(); + } } #ifdef HAVE_OPENNI @@ -373,6 +372,8 @@ void FrameGrabber::shutdown() { _capture = 0; } _initialized = false; + + thread()->quit(); } void FrameGrabber::grabFrame() { From baca4353a80a8e6224dad2dff7e1bfb464d824ef Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 11 Jul 2013 11:19:28 -0700 Subject: [PATCH 4/4] Removed stray block. --- interface/src/Webcam.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/interface/src/Webcam.cpp b/interface/src/Webcam.cpp index aa161da367..169151861c 100644 --- a/interface/src/Webcam.cpp +++ b/interface/src/Webcam.cpp @@ -430,10 +430,6 @@ void FrameGrabber::grabFrame() { #endif if (frame.empty()) { - if (_capture == 0) { - // reinitialize - - } IplImage* image = cvQueryFrame(_capture); if (image == 0) { // try again later