diff options
Diffstat (limited to 'tracker-easy/tracker-easy.cpp')
| -rw-r--r-- | tracker-easy/tracker-easy.cpp | 108 | 
1 files changed, 89 insertions, 19 deletions
| diff --git a/tracker-easy/tracker-easy.cpp b/tracker-easy/tracker-easy.cpp index 31c604c9..0487d031 100644 --- a/tracker-easy/tracker-easy.cpp +++ b/tracker-easy/tracker-easy.cpp @@ -154,8 +154,13 @@ namespace EasyTracker          // 5 - Radial fourth order          // 6 - Radial fifth order          // 7 - Radial sixth order -        for (unsigned k = 0; k < 8; k++) -            iDistCoeffsMatrix(k) = (double)iCameraInfo.dist_c[k]; +        // +        // SL: Using distortion coefficients in this way is breaking our face tracking output. +        // Just disable them for now until we invest time and effort to work it out. +        // For our face tracking use case not having proper distortion coefficients ain't a big deal anyway +        // See issues #1141 and #1020 +        //for (unsigned k = 0; k < 8; k++) +        //    iDistCoeffsMatrix(k) = (double)iCameraInfo.dist_c[k];      } @@ -165,10 +170,15 @@ namespace EasyTracker          {              MatchFiveVertices(aTopIndex, aRightIndex, aLeftIndex, aTopRight, aTopLeft);          } -        else +        else if (!iSettings.iClipModelThree)          {              MatchThreeOrFourVertices(aTopIndex, aRightIndex, aLeftIndex, aCenterIndex);          } +        else +        { +            // Clip model +            MatchClipVertices(aTopIndex, aRightIndex, aLeftIndex); +        }      } @@ -183,7 +193,7 @@ namespace EasyTracker          // Tracked points must match the order of the object model points.          // Find top most point, that's the one with min Y as we assume our guy's head is not up side down          int minY = std::numeric_limits<int>::max(); -        for (int i = 0; i < iPoints.size(); i++) +        for (int i = 0; i < (int)iPoints.size(); i++)          {              if (iPoints[i].y < minY)              { @@ -195,7 +205,7 @@ namespace EasyTracker          // Find right most point           int maxX = 0; -        for (int i = 0; i < iPoints.size(); i++) +        for (int i = 0; i < (int)iPoints.size(); i++)          {              // Excluding top most point              if (i != vertexIndices[VertexPosition::Top] && iPoints[i].x > maxX) @@ -208,7 +218,7 @@ namespace EasyTracker          // Find left most point          int minX = std::numeric_limits<int>::max(); -        for (int i = 0; i < iPoints.size(); i++) +        for (int i = 0; i < (int)iPoints.size(); i++)          {              // Excluding top most point and right most point              if (i != vertexIndices[VertexPosition::Top] && i != vertexIndices[VertexPosition::Right] && iPoints[i].x < minX) @@ -281,7 +291,7 @@ namespace EasyTracker          // Tracked points must match the order of the object model points.          // Find top most point, that's the one with min Y as we assume our guy's head is not up side down          int minY = std::numeric_limits<int>::max(); -        for (int i = 0; i < iPoints.size(); i++) +        for (int i = 0; i < (int)iPoints.size(); i++)          {              if (iPoints[i].y < minY)              { @@ -294,7 +304,7 @@ namespace EasyTracker          int maxX = 0;          // Find right most point  -        for (int i = 0; i < iPoints.size(); i++) +        for (int i = 0; i < (int)iPoints.size(); i++)          {              // Excluding top most point              if (i != aTopIndex && iPoints[i].x > maxX) @@ -306,7 +316,7 @@ namespace EasyTracker          // Find left most point          int minX = std::numeric_limits<int>::max(); -        for (int i = 0; i < iPoints.size(); i++) +        for (int i = 0; i < (int)iPoints.size(); i++)          {              // Excluding top most point and right most point              if (i != aTopIndex && i != aRightIndex && iPoints[i].x < minX) @@ -317,7 +327,7 @@ namespace EasyTracker          }          // Find center point, the last one -        for (int i = 0; i < iPoints.size(); i++) +        for (int i = 0; i < (int)iPoints.size(); i++)          {              // Excluding the three points we already have              if (i != aTopIndex && i != aRightIndex && i != aLeftIndex) @@ -337,7 +347,56 @@ namespace EasyTracker          }      } -     +    /** +    */ +    void Tracker::MatchClipVertices(int& aTopIndex, int& aMiddleIndex, int& aBottomIndex) +    { +        //Bitmap origin is top left +        iTrackedPoints.clear(); +        // Tracked points must match the order of the object model points. +        // Find top most point, that's the one with min Y as we assume our guy's head is not up side down +        int minY = std::numeric_limits<int>::max(); +        for (int i = 0; i < (int)iPoints.size(); i++) +        { +            if (iPoints[i].y < minY) +            { +                minY = iPoints[i].y; +                aTopIndex = i; +            } +        } + + +        int maxY = 0; + +        // Find bottom most point  +        for (int i = 0; i < (int)iPoints.size(); i++) +        { +            // Excluding top most point +            if (i != aTopIndex && iPoints[i].y > maxY) +            { +                maxY = iPoints[i].y; +                aBottomIndex = i; +            } +        } + + +        // Find center point, the last one +        for (int i = 0; i < (int)iPoints.size(); i++) +        { +            // Excluding the three points we already have +            if (i != aTopIndex && i != aBottomIndex) +            { +                aMiddleIndex = i; +            } +        } + +        // Order matters +        iTrackedPoints.push_back(iPoints[aTopIndex]); +        iTrackedPoints.push_back(iPoints[aMiddleIndex]); +        iTrackedPoints.push_back(iPoints[aBottomIndex]); +    } + +      ///      /// @@ -720,18 +779,29 @@ namespace EasyTracker          // We are converting them from millimeters to centimeters.          // TODO: Need to support clip too. That's cap only for now.          iModel.clear(); -        iModel.push_back(cv::Point3f(iSettings.iVertexTopX / 10.0, iSettings.iVertexTopY / 10.0, iSettings.iVertexTopZ / 10.0)); // Top -        iModel.push_back(cv::Point3f(iSettings.iVertexRightX / 10.0, iSettings.iVertexRightY / 10.0, iSettings.iVertexRightZ / 10.0)); // Right -        iModel.push_back(cv::Point3f(iSettings.iVertexLeftX / 10.0, iSettings.iVertexLeftY / 10.0, iSettings.iVertexLeftZ / 10.0)); // Left -        if (iSettings.iCustomModelFour) +        if (!iSettings.iClipModelThree)          { -            iModel.push_back(cv::Point3f(iSettings.iVertexCenterX / 10.0, iSettings.iVertexCenterY / 10.0, iSettings.iVertexCenterZ / 10.0)); // Center +            iModel.push_back(cv::Point3f(iSettings.iVertexTopX / 10.0, iSettings.iVertexTopY / 10.0, iSettings.iVertexTopZ / 10.0)); // Top +            iModel.push_back(cv::Point3f(iSettings.iVertexRightX / 10.0, iSettings.iVertexRightY / 10.0, iSettings.iVertexRightZ / 10.0)); // Right +            iModel.push_back(cv::Point3f(iSettings.iVertexLeftX / 10.0, iSettings.iVertexLeftY / 10.0, iSettings.iVertexLeftZ / 10.0)); // Left + +            if (iSettings.iCustomModelFour) +            { +                iModel.push_back(cv::Point3f(iSettings.iVertexCenterX / 10.0, iSettings.iVertexCenterY / 10.0, iSettings.iVertexCenterZ / 10.0)); // Center +            } +            else if (iSettings.iCustomModelFive) +            { +                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 +            }          } -        else if (iSettings.iCustomModelFive) +        else          { -            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 +            // Clip model type +            iModel.push_back(cv::Point3f(iSettings.iVertexClipTopX / 10.0, iSettings.iVertexClipTopY / 10.0, iSettings.iVertexClipTopZ / 10.0)); // Top +            iModel.push_back(cv::Point3f(iSettings.iVertexClipMiddleX / 10.0, iSettings.iVertexClipMiddleY / 10.0, iSettings.iVertexClipMiddleZ / 10.0)); // Middle +            iModel.push_back(cv::Point3f(iSettings.iVertexClipBottomX / 10.0, iSettings.iVertexClipBottomY / 10.0, iSettings.iVertexClipBottomZ / 10.0)); // Bottom          }          infout << "Update model - end"; | 
