diff --git a/addon_config.mk b/addon_config.mk index 268d334..55d79cc 100644 --- a/addon_config.mk +++ b/addon_config.mk @@ -77,18 +77,25 @@ osx: ADDON_INCLUDES_EXCLUDE += src/dab_tracker_zed_% vs: + ADDON_INCLUDES = ADDON_INCLUDES += "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.1/include/" + ADDON_INCLUDES += libs/astra/include + ADDON_INCLUDES += libs/azure/include + ADDON_INCLUDES += libs/gige/include + ADDON_INCLUDES += libs/nuitrack/include + ADDON_INCLUDES += libs/realsense/include + ADDON_INCLUDES += libs/ximea/include ADDON_LIBS = ADDON_LIBS += "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.1/lib/x64/" ADDON_LIBS += libs/astra/lib/win/astra.lib ADDON_LIBS += libs/astra/lib/win/astra_core.lib ADDON_LIBS += libs/astra/lib/win/astra_core_api.lib ADDON_LIBS += libs/astra/lib/win/OpenNI2.lib + ADDON_LIBS += libs/azure/lib/win/win64/k4a.lib + ADDON_LIBS += libs/azure/lib/win/win64/k4arecord.lib ADDON_LIBS += libs/gige/lib/win/win64/ImageLib.lib ADDON_LIBS += libs/gige/lib/win/win64/PvAPI.lib ADDON_LIBS += libs/nuitrack/lib/win64/middleware.lib ADDON_LIBS += libs/nuitrack/lib/win64/nuitrack.lib ADDON_LIBS += libs/realsense/lib/win/win64/realsense2.lib - ADDON_LIBS += libs/zed/lib/win/win64/sl_core64.lib - ADDON_LIBS += libs/zed/lib/win/win64/sl_input64.lib - ADDON_LIBS += libs/zed/lib/win/win64/sl_zed64.lib \ No newline at end of file + ADDON_LIBS += libs/ximea/lib/win/win64/xiapi64.lib \ No newline at end of file diff --git a/src/dab_tracker_camera.cpp b/src/dab_tracker_camera.cpp index 3ec285a..2dc3f2b 100644 --- a/src/dab_tracker_camera.cpp +++ b/src/dab_tracker_camera.cpp @@ -22,7 +22,8 @@ Camera::Camera() , mColorConversionFrame(nullptr) , mMoviePlayer(nullptr) , mMovieRecorder(nullptr) -, mMovieRecordFileName("capture.mp4") +, mMovieRecordFileName("capture") +, mMovieRecordFileSuffix("mp4") , mBlocked(false) , mCapturing(false) , mLoadSettings(false) @@ -44,7 +45,8 @@ Camera::Camera(std::array pFrameSize, unsigned int pChannelCoun , mColorConversionFrame(nullptr) , mMoviePlayer(nullptr) , mMovieRecorder(nullptr) -, mMovieRecordFileName("capture.mp4") +, mMovieRecordFileName("capture") +, mMovieRecordFileSuffix("mp4") , mBlocked(false) , mCapturing(false) , mLoadSettings(false) @@ -382,7 +384,7 @@ Camera::startRecording() throw (dab::Exception) if(mMovieRecording == true) return; bool success; - + if( mMovieRecorder == nullptr ) { mMovieRecorder = new ofxVideoRecorder(); @@ -391,7 +393,9 @@ Camera::startRecording() throw (dab::Exception) //mMovieRecorder->setVideoBitrate("10000k"); } - success = mMovieRecorder->setup(mMovieRecordFileName, mFrameSize[0], mFrameSize[1], mFrameRate); + std::string fileName = mMovieRecordFileName + "_" + ofGetTimestampString() + "." + mMovieRecordFileSuffix; + + success = mMovieRecorder->setup(fileName, mFrameSize[0], mFrameSize[1], mFrameRate); if(success == false) throw dab::Exception("TRACKER ERROR: failed to start recording to file " + mMovieRecordFileName, __FILE__, __FUNCTION__, __LINE__); mMovieRecorder->start(); @@ -410,7 +414,7 @@ Camera::stopRecording() throw (dab::Exception) } void -Camera::captureStill(const std::string& pFileName) throw (dab::Exception) +Camera::recordStill(const std::string& pFileName) throw (dab::Exception) { mCaptureStillFileName = pFileName; mCaptureStill = true; diff --git a/src/dab_tracker_camera.h b/src/dab_tracker_camera.h index 427c94b..af697f1 100644 --- a/src/dab_tracker_camera.h +++ b/src/dab_tracker_camera.h @@ -61,7 +61,7 @@ public: virtual void startRecording() throw (dab::Exception); virtual void stopRecording() throw (dab::Exception); - void captureStill(const std::string& pFileName) throw (dab::Exception); + void recordStill(const std::string& pFileName) throw (dab::Exception); void saveStill(ofxCvImage* pImage, const std::string& pFileName) throw (dab::Exception); virtual void saveSettings() throw (dab::Exception); @@ -103,6 +103,7 @@ protected: // movie recording std::string mMovieRecordFileName; + std::string mMovieRecordFileSuffix; ofxVideoRecorder* mMovieRecorder; }; diff --git a/src/dab_tracker_com_manager.cpp b/src/dab_tracker_com_manager.cpp index ef08b1e..aeab156 100644 --- a/src/dab_tracker_com_manager.cpp +++ b/src/dab_tracker_com_manager.cpp @@ -556,7 +556,9 @@ CameraOscControl::update(std::shared_ptr pMessage) const std::vector<_OscArg*>& arguments = pMessage->arguments(); - if (address.compare("/CaptureStill") == 0) captureStill(arguments); + if (address.compare("/RecordStill") == 0) recordStill(arguments); + else if (address.compare("/StartRecording") == 0) startRecording(arguments); + else if (address.compare("/StopRecording") == 0) stopRecording(arguments); } catch (dab::Exception& e) { @@ -564,8 +566,20 @@ CameraOscControl::update(std::shared_ptr pMessage) } } +void +CameraOscControl::startRecording(const std::vector<_OscArg*>& pArgs) throw (dab::Exception) +{ + mCamera->startRecording(); +} + +void +CameraOscControl::stopRecording(const std::vector<_OscArg*>& pArgs) throw (dab::Exception) +{ + mCamera->stopRecording(); +} + void -CameraOscControl::captureStill(const std::vector<_OscArg*>& pArgs) throw (dab::Exception) +CameraOscControl::recordStill(const std::vector<_OscArg*>& pArgs) throw (dab::Exception) { int argCount = pArgs.size(); @@ -574,11 +588,16 @@ CameraOscControl::captureStill(const std::vector<_OscArg*>& pArgs) throw (dab::E int timeStamp = *pArgs[0]; std::string stillFileName = "still_" + std::to_string(timeStamp); - std::cout << "CameraOscControl::captureStill " << timeStamp << "\n"; + std::cout << "CameraOscControl::recordStill " << timeStamp << "\n"; - mCamera->captureStill(stillFileName); + mCamera->recordStill(stillFileName); } - else throw(dab::Exception( "ERR_OSC: Wrong Parameters for /CaptureStill", __FILE__, __FUNCTION__, __LINE__ )); + else if (argCount == 1 && pArgs[0]->oscType() == OSC_TYPE_STRING) + { + std::string fileName = pArgs[0]->operator const std::string&(); + mCamera->recordStill(fileName); + } + else throw(dab::Exception( "ERR_OSC: Wrong Parameters for /RecordStill", __FILE__, __FUNCTION__, __LINE__ )); } #pragma mark ComManager implementation diff --git a/src/dab_tracker_com_manager.h b/src/dab_tracker_com_manager.h index df84fc7..dd7afb2 100644 --- a/src/dab_tracker_com_manager.h +++ b/src/dab_tracker_com_manager.h @@ -168,7 +168,9 @@ protected: Camera* mCamera; - void captureStill(const std::vector<_OscArg*>& pArgs) throw (dab::Exception); + void startRecording(const std::vector<_OscArg*>& pArgs) throw (dab::Exception); + void stopRecording(const std::vector<_OscArg*>& pArgs) throw (dab::Exception); + void recordStill(const std::vector<_OscArg*>& pArgs) throw (dab::Exception); std::mutex mLock; }; diff --git a/src/dab_tracker_optical_calibration.cpp b/src/dab_tracker_optical_calibration.cpp index 73ff0b0..4fc2df2 100644 --- a/src/dab_tracker_optical_calibration.cpp +++ b/src/dab_tracker_optical_calibration.cpp @@ -27,6 +27,7 @@ OpticalCalibration::OpticalCalibration(ofxCvImage* pInputImage) , mCalibrationFrameCount(sCalibrationFrameCount) , mCaptureInterval(sCaptureInterval) , mPreviousCaptureTime(0.0) +, mCapturePatternNow(false) { mFrameSize = { mInputImage->width, mInputImage->height }; @@ -70,6 +71,62 @@ OpticalCalibration::outputImage() return mOutputImage; } +OpticalCalibration::Mode +OpticalCalibration::calibrationMode() const +{ + return mCalibrationMode; +} + +std::array +OpticalCalibration::cameraMatrix() const +{ + std::array _camMatrix; + for (int rI = 0, i = 0; rI < 3; ++rI) + { + const double* _camData = mCameraMatrix.ptr(rI); + + for (int cI = 0; cI < 3; ++cI, ++i) + { + _camMatrix[i] = _camData[cI]; + } + } + + return _camMatrix; +} + +std::array +OpticalCalibration::distCoefficients() const +{ + std::array _distCoefficients; + for (int rI = 0, i = 0; rI < 8; ++rI, ++i) + { + const double* _distData = mDistCoeffs.ptr(rI); + _distCoefficients[i] = _distData[0]; + } + return _distCoefficients; +} + +void +OpticalCalibration::setCameraMatrix(const std::array& pCameraMatrix) +{ + for(int r=0, i=0; r<3; ++r) + { + for(int c=0; c<3; ++c, ++i) + { + mCameraMatrix.at(r, c) = pCameraMatrix[i]; + } + } +} + +void +OpticalCalibration::setDistCoefficients(const std::array& pDistCoefficients) +{ + for(int r=0, i=0; r<8; ++r, ++i) + { + mDistCoeffs.at(r, 0) = pDistCoefficients[i]; + } +} + void OpticalCalibration::setupGui(ofxDatGui* pGui) { @@ -106,11 +163,15 @@ OpticalCalibration::setupGui(ofxDatGui* pGui) mFlipVerticalControl = new ofxDatGuiToggle("Flip Vertical", mFlipVertical); mGuiFolder->attachItem(mFlipVerticalControl); - mFlipVerticalControl->onButtonEvent(this, &OpticalCalibration::onButtonEvent); + mFlipVerticalControl->onButtonEvent(this, &OpticalCalibration::onButtonEvent); mStartCalibrationControl = new ofxDatGuiButton("Start Calibration"); mGuiFolder->attachItem(mStartCalibrationControl); mStartCalibrationControl->onButtonEvent(this, &OpticalCalibration::onButtonEvent); + + mCapturePatternNowControl = new ofxDatGuiToggle("Capture Pattern Now"); + mGuiFolder->attachItem(mCapturePatternNowControl); + mCapturePatternNowControl->onButtonEvent(this, &OpticalCalibration::onButtonEvent); } void @@ -145,22 +206,24 @@ OpticalCalibration::update() throw (dab::Exception) } else { - std::vector patternPoints; - bool patternFound = detectCalibrationPattern(inputMat, patternPoints); + double captureTime = ofGetElapsedTimeMillis(); + + if (mCapturePatternNow == true || (mCaptureInterval > 0.0 && captureTime - mPreviousCaptureTime > mCaptureInterval ) ) + { + + std::vector patternPoints; + bool patternFound = detectCalibrationPattern(inputMat, patternPoints); - //std::cout << "patternFound " << patternFound << "\n"; + //std::cout << "patternFound " << patternFound << "\n"; - if(patternFound == true) - { - double captureTime = ofGetElapsedTimeMillis(); - - if( captureTime - mPreviousCaptureTime > mCaptureInterval) - { - //std::cout << "add points to image points\n"; - - mPreviousCaptureTime = captureTime; - mImagePoints.push_back(patternPoints); - } + if (patternFound == true) + { + //std::cout << "add points to image points\n"; + mPreviousCaptureTime = captureTime; + mCapturePatternNow = false; + mCapturePatternNowControl->setChecked(mCapturePatternNow); + mImagePoints.push_back(patternPoints); + } } mStartCalibrationControl->setLabel("Capture Frame " + std::to_string(mImagePoints.size()) + " out of " + std::to_string(mCalibrationFrameCount)); @@ -172,7 +235,7 @@ OpticalCalibration::update() throw (dab::Exception) cv::Mat inputMat = cv::cvarrToMat(mInputImage->getCvImage(), false); cv::Mat outputMat = cv::cvarrToMat(mOutputImage->getCvImage(), false); cv::undistort(inputMat, outputMat, mCameraMatrix, mDistCoeffs); - + // void cvUndistort2(const CvArr* src, CvArr* dst, const CvMat* camera_matrix, const CvMat* distortion_coeffs, const CvMat* new_camera_matrix=0 )ΒΆ } else @@ -328,7 +391,8 @@ OpticalCalibration::restoreSettings() throw (dab::Exception) mCalibrationFrameCountControl->setText(std::to_string(mCalibrationFrameCount)); mCaptureIntervalControl->setText(std::to_string(mCaptureInterval)); mAspectRatioControl->setText(std::to_string(mAspectRatio)); - mFlipVerticalControl->setEnabled(mFlipVertical); + mFlipVerticalControl->setChecked(mFlipVertical); + } catch(Exception& e) { @@ -562,4 +626,10 @@ OpticalCalibration::onButtonEvent(ofxDatGuiButtonEvent e) //std::cout << "start calibration\n"; } + else if (e.target == mCapturePatternNowControl) + { + mCapturePatternNow = static_cast(e.target)->getChecked(); + + //std::cout << "start calibration\n"; + } } diff --git a/src/dab_tracker_optical_calibration.h b/src/dab_tracker_optical_calibration.h index 95bd8ea..faac726 100644 --- a/src/dab_tracker_optical_calibration.h +++ b/src/dab_tracker_optical_calibration.h @@ -16,10 +16,19 @@ namespace tracker class OpticalCalibration : public VideoProcessor { public: + enum Pattern { NOT_EXISTING, CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID }; + enum Mode { CALIBRATING, CALIBRATED }; + OpticalCalibration(ofxCvImage* pInputImage); ~OpticalCalibration(); ofxCvImage* outputImage(); + Mode calibrationMode() const; + std::array cameraMatrix() const; + std::array distCoefficients() const; + + void setCameraMatrix(const std::array& pCameraMatrix); + void setDistCoefficients(const std::array& pDistCoefficients); void setupGui(ofxDatGui* pGui); void update() throw (dab::Exception); @@ -27,9 +36,6 @@ public: void saveSettings() throw (dab::Exception); void restoreSettings() throw (dab::Exception); - enum Pattern { NOT_EXISTING, CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID }; - enum Mode { CALIBRATING, CALIBRATED }; - protected: static cv::Size sBoardSize; static Pattern sBoardPattern; @@ -48,6 +54,7 @@ protected: float mAspectRatio; float mCaptureInterval; double mPreviousCaptureTime; + bool mCapturePatternNow; bool mCalibZeroTangentDist; // Assume zero tangential distortion bool mCalibFixPrincipalPoint;// Fix the principal point at the center bool mFlipVertical; // Flip the captured images around the horizontal axis @@ -80,6 +87,7 @@ protected: ofxDatGuiTextInput* mAspectRatioControl; ofxDatGuiToggle* mFlipVerticalControl; ofxDatGuiButton* mStartCalibrationControl; + ofxDatGuiToggle* mCapturePatternNowControl; void onTextInputEvent(ofxDatGuiTextInputEvent e); void onDropdownEvent(ofxDatGuiDropdownEvent e); diff --git a/src/dab_tracker_realsense_camera.cpp b/src/dab_tracker_realsense_camera.cpp index f5628ea..fd54b74 100644 --- a/src/dab_tracker_realsense_camera.cpp +++ b/src/dab_tracker_realsense_camera.cpp @@ -37,7 +37,7 @@ RealSenseCamera::RealSenseCamera(unsigned int pChannelCount, int pDeviceNr) thro } mMoviePlaying = false; - mMovieRecordFileName = "capture.bag"; + mMovieRecordFileSuffix = "bag"; try { @@ -63,7 +63,7 @@ RealSenseCamera::RealSenseCamera(bool pColorMode, bool pDepthMode, bool pPointCl , mDeviceNr(pDeviceNr) { mMoviePlaying = false; - mMovieRecordFileName = "capture.bag"; + mMovieRecordFileSuffix = "bag"; mFrameSize = { 0, 0 }; try @@ -90,7 +90,7 @@ RealSenseCamera::RealSenseCamera(const std::array& pResolution, , mDeviceNr(pDeviceNr) { mMoviePlaying = false; - mMovieRecordFileName = "capture.bag"; + mMovieRecordFileSuffix = "bag"; mFrameSize = pResolution; try @@ -245,9 +245,11 @@ RealSenseCamera::startRecording() throw (dab::Exception) if (mMovieRecording == true) return; if (mMovieRecordFileName.empty() == true) return; + std::string fileName = mMovieRecordFileName + "_" + ofGetTimestampString() + "." + mMovieRecordFileSuffix; + try { - RealSenseTools::get().startRecording(mSelf, mMovieRecordFileName); + RealSenseTools::get().startRecording(mSelf, fileName); } catch (const dab::Exception&) { diff --git a/src/dab_tracker_realsense_tools.cpp b/src/dab_tracker_realsense_tools.cpp index d02831e..9e16267 100644 --- a/src/dab_tracker_realsense_tools.cpp +++ b/src/dab_tracker_realsense_tools.cpp @@ -326,6 +326,16 @@ RealSenseTools::initControls(std::shared_ptr pCamera) throw (da Parameter* maxDepthControl = new Parameter("maxdepth", maxDepth, 0, 10000); // what are the min and max values for color fps?? maxDepthControl->registerParameterListener(pCamera); pCamera->mControls["maxdepth"] = maxDepthControl; + + // IR Emitter Enabled + auto depth_sensor = pCamera->mNativeDevice.first(); + if (depth_sensor.supports(RS2_OPTION_EMITTER_ENABLED)) + { + bool emitterActive = true; + Parameter* emitterControl = new Parameter("emitter", emitterActive, false, true); + emitterControl->registerParameterListener(pCamera); + pCamera->mControls["emitter"] = emitterControl; + } } } @@ -362,6 +372,12 @@ RealSenseTools::setControlValue(const std::string& pControlName, const AbstractV pCamera->mMaxDepth = maxdepth; } + else if (pControlName == "emitter") + { + bool emitterActive = pValue.get(); + auto depth_sensor = pCamera->mNativeDevice.first(); + depth_sensor.set_option(RS2_OPTION_EMITTER_ENABLED, static_cast(emitterActive)); + } //else if (pControlName == "skeletonsmoothing") //{ // if (pCamera->mSkeletonTracker == nullptr) throw Exception("TRACKER ERROR: camera contains no skeleton tracker", __FILE__, __FUNCTION__, __LINE__);