diff options
| author | Stéphane Lenclud <github@lenclud.com> | 2019-05-19 16:08:02 +0200 | 
|---|---|---|
| committer | Stéphane Lenclud <github@lenclud.com> | 2019-05-19 16:10:04 +0200 | 
| commit | 48b80fb28b9e6e44267c9d1edb8a9968ff81fea5 (patch) | |
| tree | b68e4e768e1d4fad5c9aa8fa34e90676179f908c /tracker-easy | |
| parent | da9a7a32cbce280283883c6332484ec2358346c2 (diff) | |
Easy Tracker: Fixing deadlock occurring after changing ticker timer interval.
Was mostly affecting color cameras.
Not attempting to extract points from color buffer any more.
Diffstat (limited to 'tracker-easy')
| -rw-r--r-- | tracker-easy/tracker-easy.cpp | 43 | 
1 files changed, 32 insertions, 11 deletions
diff --git a/tracker-easy/tracker-easy.cpp b/tracker-easy/tracker-easy.cpp index dd96e782..614eb55c 100644 --- a/tracker-easy/tracker-easy.cpp +++ b/tracker-easy/tracker-easy.cpp @@ -9,6 +9,7 @@  #include "video/video-widget.hpp"  #include "compat/math-imports.hpp"  #include "compat/check-visible.hpp" +#include "compat/sleep.hpp"  #include "point-extractor.h"  #include "cv/init.hpp" @@ -45,8 +46,8 @@ namespace EasyTracker      {          opencv_init(); -        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(iSettings.b.get(), &bundle_::saving, this, &Tracker::CheckCamera, Qt::DirectConnection); +        connect(iSettings.b.get(), &bundle_::reloading, this, &Tracker::CheckCamera, Qt::DirectConnection);          connect(&iSettings.fov, value_::value_changed<int>(), this, &Tracker::set_fov, Qt::DirectConnection);          set_fov(iSettings.fov); @@ -332,6 +333,7 @@ namespace EasyTracker      ///      void Tracker::ProcessFrame()      { +        //infout << "ProcessFrame - begin";          QMutexLocker l(&iProcessLock);          // Create OpenCV matrix from our frame @@ -346,7 +348,14 @@ namespace EasyTracker          }          iPoints.clear(); -        iPointExtractor.ExtractPoints(iMatFrame, (doPreview ? &iPreview.iFrameRgb : nullptr), iModel.size(), iPoints); + +        // Do not attempt point extraction on a color buffer as it is running real slow and is useless anyway. +        // If we are ever going to support color buffer we will need another implementation. +        if (iFrame.channels == 1) +        {             +            iPointExtractor.ExtractPoints(iMatFrame, (doPreview ? &iPreview.iFrameRgb : nullptr), iModel.size(), iPoints); +        } +                  const bool success = iPoints.size() >= iModel.size() && iModel.size() >= KMinVertexCount; @@ -581,8 +590,8 @@ namespace EasyTracker              }          } -        dbgout << "Frame time:" << iTimer.elapsed_seconds() << "\n"; - +        dbgout << "Frame time:" << iTimer.elapsed_seconds(); +        //infout << "ProcessFrame - end";      }      /// @@ -590,7 +599,13 @@ namespace EasyTracker      ///      void Tracker::Tick()      { -        maybe_reopen_camera(); +        if (CheckCamera()) +        { +            // Camera was just started, skipping that frame as it was causing a deadlock on our process mutex in ProcessFrame +            // In fact it looked like ProcessFrame was called twice without completing. +            // That has something to do with the ticker interval being changed after the camera is started. +            return; +        }          iTimer.start(); @@ -627,13 +642,14 @@ namespace EasyTracker      } -    bool Tracker::maybe_reopen_camera() +    /// @return True if camera was just started, false otherwise. +    bool Tracker::CheckCamera()      {          QMutexLocker l(&camera_mtx);          if (camera->is_open())          { -            return true; +            return false;          }          iCameraInfo.fps = iSettings.cam_fps; @@ -641,7 +657,9 @@ namespace EasyTracker          iCameraInfo.height = iSettings.cam_res_y;          bool res = camera->start(iCameraInfo); -        // We got new our camera intrinsics, create corresponding matrices +        //portable::sleep(5000); + +        // We got our camera intrinsics, create corresponding matrices          CreateCameraIntrinsicsMatrices();          // If ever the camera implementation provided an FPS now is the time to apply it @@ -683,7 +701,7 @@ namespace EasyTracker      ///      void Tracker::UpdateModel()      { -        infout << "Update model"; +        infout << "Update model - begin";          QMutexLocker lock(&iProcessLock);          // Construct the points defining the object we want to detect based on settings. @@ -703,6 +721,8 @@ namespace EasyTracker              iModel.push_back(cv::Point3f(iSettings.iVertexTopRightX / 10.0, iSettings.iVertexTopRightY / 10.0, iSettings.iVertexTopRightZ / 10.0)); // Top Right              iModel.push_back(cv::Point3f(iSettings.iVertexTopLeftX / 10.0, iSettings.iVertexTopLeftY / 10.0, iSettings.iVertexTopLeftZ / 10.0)); // Top Left          } + +        infout << "Update model - end";      }      /// @@ -710,7 +730,7 @@ namespace EasyTracker      ///      void Tracker::UpdateSettings()      { -        infout << "Update Setting"; +        infout << "Update Setting - begin";          QMutexLocker l(&iProcessLock);          iPointExtractor.UpdateSettings();          iSolver = iSettings.PnpSolver; @@ -718,6 +738,7 @@ namespace EasyTracker          iDeadzoneEdge = iDeadzoneHalfEdge * 2;          iTrackedRects.clear();          iDebug = iSettings.debug; +        infout << "Update Setting - end";      }      ///  | 
