diff --git a/openbr/plugins/landmarks.cpp b/openbr/plugins/landmarks.cpp index 35be2de..b9fed85 100644 --- a/openbr/plugins/landmarks.cpp +++ b/openbr/plugins/landmarks.cpp @@ -21,11 +21,7 @@ class ProcrustesTransform : public Transform { Q_OBJECT - Q_PROPERTY(float normReduction READ get_normReduction WRITE set_normReduction RESET reset_normReduction STORED false) - Q_PROPERTY(bool center READ get_center WRITE set_center RESET reset_center STORED false) Q_PROPERTY(bool warp READ get_warp WRITE set_warp RESET reset_warp STORED false) - BR_PROPERTY(float, normReduction, 1) - BR_PROPERTY(bool, center, true) BR_PROPERTY(bool, warp, true) Eigen::MatrixXf meanShape; @@ -53,10 +49,7 @@ class ProcrustesTransform : public Transform // Remove scale component float norm = cv::norm(OpenCVUtils::toPoints(points).toVector().toStdVector()); - for (int i = 0; i < points.size(); i++) { - points[i] /= (norm/normReduction); - if (center) points[i] += QPointF(datum.m().cols/2,datum.m().rows/2); - } + for (int i = 0; i < points.size(); i++) points[i] /= norm; normalizedPoints.append(points); } @@ -106,8 +99,7 @@ class ProcrustesTransform : public Transform Eigen::MatrixXf srcMat(points.size(), 2); float norm = cv::norm(OpenCVUtils::toPoints(points).toVector().toStdVector()); for (int i = 0; i < points.size(); i++) { - points[i] /= (norm/normReduction); - if (center) points[i] += QPointF(src.m().cols/2,src.m().rows/2); + points[i] /= norm; srcMat(i,0) = points[i].x(); srcMat(i,1) = points[i].y(); } @@ -156,10 +148,14 @@ class DelaunayTransform : public UntrainableTransform { Q_OBJECT - Q_PROPERTY(float normReduction READ get_normReduction WRITE set_normReduction RESET reset_normReduction STORED false) + Q_PROPERTY(float scaleFactor READ get_scaleFactor WRITE set_scaleFactor RESET reset_scaleFactor STORED false) + Q_PROPERTY(QString widthCrop READ get_widthCrop WRITE set_widthCrop RESET reset_widthCrop STORED false) + Q_PROPERTY(QString heightCrop READ get_heightCrop WRITE set_heightCrop RESET reset_heightCrop STORED false) Q_PROPERTY(bool warp READ get_warp WRITE set_warp RESET reset_warp STORED false) Q_PROPERTY(bool draw READ get_draw WRITE set_draw RESET reset_draw STORED false) - BR_PROPERTY(float, normReduction, 1) + BR_PROPERTY(float, scaleFactor, 1) + BR_PROPERTY(QString, widthCrop, QString()) + BR_PROPERTY(QString, heightCrop, QString()) BR_PROPERTY(bool, warp, true) BR_PROPERTY(bool, draw, false) @@ -205,7 +201,7 @@ class DelaunayTransform : public UntrainableTransform bool inside = true; for (int j = 0; j < 3; j++) { - if (pt[j].x > src.m().cols || pt[j].y > src.m().rows || pt[j].x <= 0 || pt[j].y <= 0) inside = false; + if (pt[j].x > src.m().cols || pt[j].y > src.m().rows || pt[j].x < 0 || pt[j].y < 0) inside = false; } if (inside) validTriangles.append(QList()<< pt[0] << pt[1] << pt[2]); @@ -221,8 +217,6 @@ class DelaunayTransform : public UntrainableTransform } } - bool warp = true; - if (warp) { Eigen::MatrixXf R(2,2); R(0,0) = src.file.get("Procrustes_0_0"); @@ -243,9 +237,9 @@ class DelaunayTransform : public UntrainableTransform for (int i = 0; i < validTriangles.size(); i++) { Eigen::MatrixXf srcMat(validTriangles[i].size(), 2); - for (int j = 0; j < validTriangles[i].size(); j++) { - srcMat(j,0) = (validTriangles[i][j].x-mean[0])/(norm/normReduction)+src.m().cols/2; - srcMat(j,1) = (validTriangles[i][j].y-mean[1])/(norm/normReduction)+src.m().rows/2; + for (int j = 0; j < 3; j++) { + srcMat(j,0) = (validTriangles[i][j].x-mean[0])/norm; + srcMat(j,1) = (validTriangles[i][j].y-mean[1])/norm; } Eigen::MatrixXf dstMat = srcMat*R; @@ -255,8 +249,10 @@ class DelaunayTransform : public UntrainableTransform Point2f dstPoints[3]; for (int j = 0; j < 3; j++) { - dstPoints[j] = Point2f(dstMat(j,0),dstMat(j,1)); - mappedPoints.append(dstPoints[j]); + // Scale and shift destination points + Point2f warpedPoint = Point2f(dstMat(j,0)*scaleFactor+src.m().cols/2,dstMat(j,1)*scaleFactor+src.m().rows/2); + dstPoints[j] = warpedPoint; + mappedPoints.append(warpedPoint); } Mat buffer(src.m().rows,src.m().cols,src.m().type()); @@ -274,7 +270,7 @@ class DelaunayTransform : public UntrainableTransform Mat output(src.m().rows,src.m().cols,src.m().type()); - // Optimize + // Optimization needed if (i > 0) { Mat overlap; bitwise_and(dst.m(),mask,overlap); @@ -294,12 +290,10 @@ class DelaunayTransform : public UntrainableTransform Rect boundingBox = boundingRect(mappedPoints.toVector().toStdVector()); - boundingBox.x += 0; //boundingBox.width * .05; - boundingBox.y += boundingBox.height * .1; // 0.025 for nose, .05 for mouth, .10 for brow - boundingBox.width *= 1;//.975; - boundingBox.height *= .80; // .975 for nose, .95 for mouth, .925 for brow - - qDebug() << boundingBox; + boundingBox.x += boundingBox.width * QtUtils::toPoint(widthCrop).x(); + boundingBox.y += boundingBox.height * QtUtils::toPoint(heightCrop).x(); + boundingBox.width *= 1-QtUtils::toPoint(widthCrop).y(); + boundingBox.height *= 1-QtUtils::toPoint(heightCrop).y(); dst.m() = Mat(dst.m(), boundingBox); } diff --git a/openbr/plugins/regions.cpp b/openbr/plugins/regions.cpp index 325d7a8..f047fb6 100644 --- a/openbr/plugins/regions.cpp +++ b/openbr/plugins/regions.cpp @@ -230,6 +230,7 @@ class RectFromPointsTransform : public UntrainableTransform if (src.file.points()[index].y() > maxY) maxY = src.file.points()[index].y(); points.append(src.file.points()[index]); } + else qFatal("Incorrect indices"); } double width = maxX-minX;