diff options
| -rw-r--r-- | tracker-easy/tracker-easy.cpp | 26 | ||||
| -rw-r--r-- | tracker-easy/tracker-easy.h | 10 | ||||
| -rw-r--r-- | tracker-kinect-face/camera_kinect_ir.cpp | 332 | ||||
| -rw-r--r-- | tracker-kinect-face/camera_kinect_ir.h | 6 | 
4 files changed, 189 insertions, 185 deletions
| diff --git a/tracker-easy/tracker-easy.cpp b/tracker-easy/tracker-easy.cpp index 68e3be36..4afb928a 100644 --- a/tracker-easy/tracker-easy.cpp +++ b/tracker-easy/tracker-easy.cpp @@ -36,17 +36,17 @@ namespace EasyTracker  {      Tracker::Tracker() : -        s{ KModuleName }, +        iSettings{ KModuleName },          iPreview{ preview_width, preview_height }      {          cv::setBreakOnError(true);          cv::setNumThreads(1); -        connect(s.b.get(), &bundle_::saving, this, &Tracker::maybe_reopen_camera, Qt::DirectConnection); -        connect(s.b.get(), &bundle_::reloading, this, &Tracker::maybe_reopen_camera, Qt::DirectConnection); +        connect(iSettings.b.get(), &bundle_::saving, this, &Tracker::maybe_reopen_camera, Qt::DirectConnection); +        connect(iSettings.b.get(), &bundle_::reloading, this, &Tracker::maybe_reopen_camera, Qt::DirectConnection); -        connect(&s.fov, value_::value_changed<int>(), this, &Tracker::set_fov, Qt::DirectConnection); -        set_fov(s.fov); +        connect(&iSettings.fov, value_::value_changed<int>(), this, &Tracker::set_fov, Qt::DirectConnection); +        set_fov(iSettings.fov);          CreateModelFromSettings();      } @@ -92,8 +92,8 @@ namespace EasyTracker          // TODO: Need to support clip too. That's cap only for now.          // s.active_model_panel != PointModel::Clip          iModel.clear(); -        iModel.push_back(cv::Point3f(s.cap_x / 10.0, s.cap_z / 10.0, -s.cap_y / 10.0)); // Right -        iModel.push_back(cv::Point3f(-s.cap_x / 10.0, s.cap_z / 10.0, -s.cap_y / 10.0)); // Left +        iModel.push_back(cv::Point3f(iSettings.cap_x / 10.0, iSettings.cap_z / 10.0, -iSettings.cap_y / 10.0)); // Right +        iModel.push_back(cv::Point3f(-iSettings.cap_x / 10.0, iSettings.cap_z / 10.0, -iSettings.cap_y / 10.0)); // Left          iModel.push_back(cv::Point3f(0, 0, 0)); // Top      } @@ -286,7 +286,7 @@ namespace EasyTracker                      }                      // Show full size preview pop-up -                    if (s.debug) +                    if (iSettings.debug)                      {                          cv::imshow("Preview", iPreview.iFrameRgb);                          cv::waitKey(1); @@ -306,7 +306,7 @@ namespace EasyTracker                  else                  {                      // No preview, destroy preview pop-up -                    if (s.debug) +                    if (iSettings.debug)                      {                          cv::destroyWindow("Preview");                      }                     @@ -345,9 +345,9 @@ namespace EasyTracker              return true;          } -        iCameraInfo.fps = s.cam_fps; -        iCameraInfo.width = s.cam_res_x; -        iCameraInfo.height = s.cam_res_y; +        iCameraInfo.fps = iSettings.cam_fps; +        iCameraInfo.width = iSettings.cam_res_x; +        iCameraInfo.height = iSettings.cam_res_y;          bool res = camera->start(iCameraInfo);          // We got new our camera intrinsics, create corresponding matrices @@ -374,7 +374,7 @@ namespace EasyTracker          video_frame->show();          // Create our camera -        camera = video::make_camera(s.camera_name); +        camera = video::make_camera(iSettings.camera_name);          start(QThread::HighPriority); diff --git a/tracker-easy/tracker-easy.h b/tracker-easy/tracker-easy.h index 257dd6ca..06551533 100644 --- a/tracker-easy/tracker-easy.h +++ b/tracker-easy/tracker-easy.h @@ -39,11 +39,16 @@ namespace EasyTracker      struct Tracker : QThread, ITracker      { -    public: +        // We had problem where Qt slots would not get disconnected upon object destruction. +        // Issue seems to be gone now even without Q_OBJECT declaration, go figure. +        //Q_OBJECT +    public:                  friend class Dialog;          explicit Tracker();          ~Tracker() override; + +        // From ITracker          module_status start_tracker(QFrame* parent_window) override;          void data(double* data) override;          bool center() override; @@ -52,6 +57,7 @@ namespace EasyTracker          void CreateModelFromSettings();          void CreateCameraIntrinsicsMatrices(); +        // From QThread          void run() override;          bool maybe_reopen_camera(); @@ -60,7 +66,7 @@ namespace EasyTracker          QMutex camera_mtx; -        Settings s; +        Settings iSettings;          std::unique_ptr<QLayout> layout;          std::vector<cv::Point> iPoints; diff --git a/tracker-kinect-face/camera_kinect_ir.cpp b/tracker-kinect-face/camera_kinect_ir.cpp index e170b15a..b881d51f 100644 --- a/tracker-kinect-face/camera_kinect_ir.cpp +++ b/tracker-kinect-face/camera_kinect_ir.cpp @@ -10,7 +10,7 @@  #ifdef OTR_HAVE_OPENCV -//#include "frame.hpp" + //#include "frame.hpp"  #include "compat/sleep.hpp"  #include "compat/math-imports.hpp" @@ -28,7 +28,7 @@ namespace Kinect {      {          if (name.compare(KKinectIRSensor) == 0)          { -            return std::make_unique<CameraKinectIr>(); +            return std::make_unique<InfraredCamera>();          }          return nullptr; @@ -49,239 +49,237 @@ namespace Kinect {          return false;      } -// Register our camera provider thus making sure Point Tracker can use Kinect V2 IR Sensor -OTR_REGISTER_CAMERA(CamerasProvider) +    // Register our camera provider thus making sure Point Tracker can use Kinect V2 IR Sensor +    OTR_REGISTER_CAMERA(CamerasProvider) -CameraKinectIr::CameraKinectIr()  -{ -} - +    InfraredCamera::InfraredCamera() +    { +    } -CameraKinectIr::~CameraKinectIr() -{ -    stop(); -} -bool CameraKinectIr::show_dialog() -{ -    return false; -} +    InfraredCamera::~InfraredCamera() +    { +        stop(); +    } -bool CameraKinectIr::is_open() -{ -    return iInfraredFrameReader!=nullptr; -} +    bool InfraredCamera::show_dialog() +    { +        return false; +    } -/// -/// Wait until we get a first frame -/// -void CameraKinectIr::WaitForFirstFrame() -{ -    bool new_frame = false; -    int attempts = 200; // Kinect cold start can take a while -    while (!new_frame && attempts>0) +    bool InfraredCamera::is_open()      { -        new_frame = get_frame_(iMatFrame); -        portable::sleep(100); -        --attempts; +        return iInfraredFrameReader != nullptr;      } -} +    /// +    /// Wait until we get a first frame +    /// +    void InfraredCamera::WaitForFirstFrame() +    { +        bool new_frame = false; +        int attempts = 200; // Kinect cold start can take a while +        while (!new_frame && attempts > 0) +        { +            new_frame = get_frame_(iMatFrame); +            portable::sleep(100); +            --attempts; +        } +    } -std::tuple<const video::impl::frame&, bool> CameraKinectIr::get_frame() -{ -    bool new_frame = false; -    new_frame = get_frame_(iMatFrame); -         -    iFrame.data = iMatFrame.ptr(); -    iFrame.width = iWidth; -    iFrame.height = iHeight; -    iFrame.stride = cv::Mat::AUTO_STEP; -    iFrame.channels = iMatFrame.channels(); -    iFrame.channelSize = iMatFrame.elemSize1(); -    return { iFrame, new_frame }; -} -// Safe release for interfaces -template<class Interface> -inline void SafeRelease(Interface *& pInterfaceToRelease) -{ -    if (pInterfaceToRelease != NULL) +    std::tuple<const video::impl::frame&, bool> InfraredCamera::get_frame()      { -        pInterfaceToRelease->Release(); -        pInterfaceToRelease = NULL; -    } -} - -/// -/// -/// -bool CameraKinectIr::start(info& aInfo) -{ -    stop(); +        bool new_frame = false; +        new_frame = get_frame_(iMatFrame); -    HRESULT hr; +        iFrame.data = iMatFrame.ptr(); +        iFrame.width = iWidth; +        iFrame.height = iHeight; +        iFrame.stride = cv::Mat::AUTO_STEP; +        iFrame.channels = iMatFrame.channels(); +        iFrame.channelSize = iMatFrame.elemSize1(); +        return { iFrame, new_frame }; +    } -    // Get and open Kinect sensor -    hr = GetDefaultKinectSensor(&iKinectSensor); -    if (SUCCEEDED(hr)) +    // Safe release for interfaces +    template<class Interface> +    inline void SafeRelease(Interface *& pInterfaceToRelease)      { -        hr = iKinectSensor->Open(); +        if (pInterfaceToRelease != NULL) +        { +            pInterfaceToRelease->Release(); +            pInterfaceToRelease = NULL; +        }      } -    // Create infrared frame reader	 -    if (SUCCEEDED(hr)) +    /// +    /// +    /// +    bool InfraredCamera::start(info& aInfo)      { -        // Initialize the Kinect and get the infrared reader -        IInfraredFrameSource* pInfraredFrameSource = NULL; +        stop(); -        hr = iKinectSensor->Open(); +        HRESULT hr; +        // Get and open Kinect sensor +        hr = GetDefaultKinectSensor(&iKinectSensor);          if (SUCCEEDED(hr))          { -            hr = iKinectSensor->get_InfraredFrameSource(&pInfraredFrameSource); +            hr = iKinectSensor->Open();          } +        // Create infrared frame reader	          if (SUCCEEDED(hr))          { -            hr = pInfraredFrameSource->OpenReader(&iInfraredFrameReader); -        } +            // Initialize the Kinect and get the infrared reader +            IInfraredFrameSource* pInfraredFrameSource = NULL; -        SafeRelease(pInfraredFrameSource); +            hr = iKinectSensor->Open(); -        if (SUCCEEDED(hr)) -        { -            iKinectSensor->get_CoordinateMapper(&iCoordinateMapper); -        } -    } +            if (SUCCEEDED(hr)) +            { +                hr = iKinectSensor->get_InfraredFrameSource(&pInfraredFrameSource); +            } +            if (SUCCEEDED(hr)) +            { +                hr = pInfraredFrameSource->OpenReader(&iInfraredFrameReader); +            } -    if (SUCCEEDED(hr)) -    { -        WaitForFirstFrame(); -        bool success = iMatFrame.ptr() != nullptr; -        if (success) -        { -            // Provide frame info -            aInfo.width = iWidth; -            aInfo.height = iHeight; +            SafeRelease(pInfraredFrameSource); -            CameraIntrinsics intrinsics; -            hr = iCoordinateMapper->GetDepthCameraIntrinsics(&intrinsics);              if (SUCCEEDED(hr))              { -                aInfo.focalLengthX = intrinsics.FocalLengthX; -                aInfo.focalLengthY = intrinsics.FocalLengthY; -                aInfo.principalPointX = intrinsics.PrincipalPointX; -                aInfo.principalPointY = intrinsics.PrincipalPointY; -                aInfo.radialDistortionFourthOrder = intrinsics.RadialDistortionFourthOrder; -                aInfo.radialDistortionSecondOrder = intrinsics.RadialDistortionSecondOrder; -                aInfo.radialDistortionSixthOrder = intrinsics.RadialDistortionSixthOrder;                 +                iKinectSensor->get_CoordinateMapper(&iCoordinateMapper);              } -          } -        return success; -    } -    stop(); -    return false; -} +        if (SUCCEEDED(hr)) +        { +            WaitForFirstFrame(); +            bool success = iMatFrame.ptr() != nullptr; +            if (success) +            { +                // Provide frame info +                aInfo.width = iWidth; +                aInfo.height = iHeight; + +                CameraIntrinsics intrinsics; +                hr = iCoordinateMapper->GetDepthCameraIntrinsics(&intrinsics); +                if (SUCCEEDED(hr)) +                { +                    aInfo.focalLengthX = intrinsics.FocalLengthX; +                    aInfo.focalLengthY = intrinsics.FocalLengthY; +                    aInfo.principalPointX = intrinsics.PrincipalPointX; +                    aInfo.principalPointY = intrinsics.PrincipalPointY; +                    aInfo.radialDistortionFourthOrder = intrinsics.RadialDistortionFourthOrder; +                    aInfo.radialDistortionSecondOrder = intrinsics.RadialDistortionSecondOrder; +                    aInfo.radialDistortionSixthOrder = intrinsics.RadialDistortionSixthOrder; +                } -void CameraKinectIr::stop() -{ -    // done with infrared frame reader -    SafeRelease(iInfraredFrame); -    SafeRelease(iInfraredFrameReader); +            } -    // close the Kinect Sensor -    if (iKinectSensor) -    { -        iKinectSensor->Close(); +            return success; +        } + +        stop(); +        return false;      } -    SafeRelease(iCoordinateMapper); -    SafeRelease(iKinectSensor); +    void InfraredCamera::stop() +    { +        // done with infrared frame reader +        SafeRelease(iInfraredFrame); +        SafeRelease(iInfraredFrameReader); -    // Free up our memory buffer if any -    iMatFrame = cv::Mat(); -} +        // close the Kinect Sensor +        if (iKinectSensor) +        { +            iKinectSensor->Close(); +        } -bool CameraKinectIr::get_frame_(cv::Mat& aFrame) -{ +        SafeRelease(iCoordinateMapper); +        SafeRelease(iKinectSensor); -    if (!iInfraredFrameReader) -    { -        return false; +        // Free up our memory buffer if any +        iMatFrame = cv::Mat();      } -    bool success = false; +    bool InfraredCamera::get_frame_(cv::Mat& aFrame) +    { -    // Release previous frame if any -    SafeRelease(iInfraredFrame); +        if (!iInfraredFrameReader) +        { +            return false; +        } -    HRESULT hr = iInfraredFrameReader->AcquireLatestFrame(&iInfraredFrame); +        bool success = false; -    if (SUCCEEDED(hr)) -    { -        if (iFirstFrame) -        { -            IFrameDescription* frameDescription = NULL; +        // Release previous frame if any +        SafeRelease(iInfraredFrame); -            if (SUCCEEDED(hr)) -            { -                hr = iInfraredFrame->get_FrameDescription(&frameDescription); -            } +        HRESULT hr = iInfraredFrameReader->AcquireLatestFrame(&iInfraredFrame); -            if (SUCCEEDED(hr)) +        if (SUCCEEDED(hr)) +        { +            if (iFirstFrame)              { -                hr = frameDescription->get_Width(&iWidth); +                IFrameDescription* frameDescription = NULL; + +                if (SUCCEEDED(hr)) +                { +                    hr = iInfraredFrame->get_FrameDescription(&frameDescription); +                } + +                if (SUCCEEDED(hr)) +                { +                    hr = frameDescription->get_Width(&iWidth); +                } + +                if (SUCCEEDED(hr)) +                { +                    hr = frameDescription->get_Height(&iHeight); +                } + +                if (SUCCEEDED(hr)) +                { +                    hr = frameDescription->get_DiagonalFieldOfView(&iFov); +                } + +                if (SUCCEEDED(hr)) +                { +                    iFirstFrame = false; +                } + +                SafeRelease(frameDescription);              } -            if (SUCCEEDED(hr)) -            { -                hr = frameDescription->get_Height(&iHeight); -            } + +            UINT nBufferSize = 0; +            UINT16 *pBuffer = NULL;              if (SUCCEEDED(hr))              { -                hr = frameDescription->get_DiagonalFieldOfView(&iFov); +                hr = iInfraredFrame->AccessUnderlyingBuffer(&nBufferSize, &pBuffer);              }              if (SUCCEEDED(hr))              { -                iFirstFrame = false; +                // Create an OpenCV matrix with our 16-bits IR buffer +                aFrame = cv::Mat(iHeight, iWidth, CV_16UC1, pBuffer, cv::Mat::AUTO_STEP); +                // Any processing of the frame is left to the user +                success = true;              } -                 -            SafeRelease(frameDescription);          } -        UINT nBufferSize = 0; -        UINT16 *pBuffer = NULL; - -        if (SUCCEEDED(hr)) -        { -            hr = iInfraredFrame->AccessUnderlyingBuffer(&nBufferSize, &pBuffer); -        } - -        if (SUCCEEDED(hr)) -        { -            // Create an OpenCV matrix with our 16-bits IR buffer -            aFrame = cv::Mat(iHeight, iWidth, CV_16UC1, pBuffer, cv::Mat::AUTO_STEP); -            // Any processing of the frame is left to the user -            success = true; -        } +        return success;      } - -    return success; -} - - -  }  #endif diff --git a/tracker-kinect-face/camera_kinect_ir.h b/tracker-kinect-face/camera_kinect_ir.h index b88efdcd..83acb4d6 100644 --- a/tracker-kinect-face/camera_kinect_ir.h +++ b/tracker-kinect-face/camera_kinect_ir.h @@ -39,10 +39,10 @@ namespace Kinect {  ///  /// Implement our camera interface using Kinect V2 SDK IR Sensor.  /// -struct CameraKinectIr final : video::impl::camera +struct InfraredCamera final : video::impl::camera  { -    CameraKinectIr(); -    ~CameraKinectIr() override; +    InfraredCamera(); +    ~InfraredCamera() override;      // From video::impl::camera      [[nodiscard]] bool start(info& args) override; | 
