summaryrefslogtreecommitdiffhomepage
path: root/tracker-easy/tracker-easy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tracker-easy/tracker-easy.cpp')
-rw-r--r--tracker-easy/tracker-easy.cpp108
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";