Commit bb82e2dbc507292e0c8d564836c922924c23f69e
1 parent
85ee2f90
Switched to using two variables
Showing
1 changed file
with
33 additions
and
35 deletions
openbr/plugins/stasm4.cpp
| ... | ... | @@ -64,8 +64,10 @@ class StasmTransform : public UntrainableTransform |
| 64 | 64 | BR_PROPERTY(bool, stasm3Format, false) |
| 65 | 65 | Q_PROPERTY(bool clearLandmarks READ get_clearLandmarks WRITE set_clearLandmarks RESET reset_clearLandmarks STORED false) |
| 66 | 66 | BR_PROPERTY(bool, clearLandmarks, false) |
| 67 | - Q_PROPERTY(QStringList pinEyes READ get_pinEyes WRITE set_pinEyes RESET reset_pinEyes STORED false) | |
| 68 | - BR_PROPERTY(QStringList, pinEyes, QStringList()) | |
| 67 | + Q_PROPERTY(QList<float> pinPoints READ get_pinPoints WRITE set_pinPoints RESET reset_pinPoints STORED false) | |
| 68 | + BR_PROPERTY(QList<float>, pinPoints, QList<float>()) | |
| 69 | + Q_PROPERTY(QStringList pinLabels READ get_pinLabels WRITE set_pinLabels RESET reset_pinLabels STORED false) | |
| 70 | + BR_PROPERTY(QStringList, pinLabels, QStringList()) | |
| 69 | 71 | |
| 70 | 72 | Resource<StasmCascadeClassifier> stasmCascadeResource; |
| 71 | 73 | |
| ... | ... | @@ -91,43 +93,39 @@ class StasmTransform : public UntrainableTransform |
| 91 | 93 | int nLandmarks = stasm_NLANDMARKS; |
| 92 | 94 | float landmarks[2 * stasm_NLANDMARKS]; |
| 93 | 95 | |
| 94 | - if (!pinEyes.isEmpty()) { | |
| 95 | - // Two use cases are accounted for: | |
| 96 | - // 1. Pin eyes without normalization: in this case the string list should contain the KEYS for right then left eyes, respectively. | |
| 97 | - // 2. Pin eyes with normalization: in this case the string list should contain the COORDINATES of the right then left eyes, respectively. | |
| 98 | - // If both cases fail, we default to stasm_search_single. | |
| 96 | + bool searchPinned = false; | |
| 97 | + | |
| 98 | + QPointF rightEye, leftEye; | |
| 99 | + /* Two use cases are accounted for: | |
| 100 | + * 1. Pin eyes without normalization: in this case the string list should contain the KEYS for right then left eyes, respectively. | |
| 101 | + * 2. Pin eyes with normalization: in this case the string list should contain the COORDINATES of the right then left eyes, respectively. | |
| 102 | + * Currently, we only support normalization with a transformation such that the src file contains Affine_0 and Affine_1. Checking for | |
| 103 | + * these keys prevents us from pinning eyes on a face that wasn't actually transformed (see AffineTransform). | |
| 104 | + * If both cases fail, we default to stasm_search_single. */ | |
| 105 | + | |
| 106 | + if (!pinPoints.isEmpty() && src.file.contains("Affine_0") && src.file.contains("Affine_1")) { | |
| 107 | + rightEye = QPointF(pinPoints.at(0), pinPoints.at(1)); | |
| 108 | + leftEye = QPointF(pinPoints.at(2), pinPoints.at(3)); | |
| 109 | + searchPinned = true; | |
| 110 | + } else if (!pinLabels.isEmpty()) { | |
| 111 | + rightEye = src.file.get<QPointF>(pinLabels.at(0), QPointF()); | |
| 112 | + leftEye = src.file.get<QPointF>(pinLabels.at(1), QPointF()); | |
| 113 | + searchPinned = true; | |
| 114 | + } | |
| 115 | + | |
| 116 | + if (searchPinned) { | |
| 117 | + float pins[2 * stasm_NLANDMARKS]; | |
| 99 | 118 | |
| 100 | - bool ok = false; | |
| 101 | - QPointF rightEye; | |
| 102 | - QPointF leftEye; | |
| 103 | - | |
| 104 | - if (src.file.contains("Affine_0") && src.file.contains("Affine_1")) { | |
| 105 | - rightEye = QtUtils::toPoint(pinEyes.at(0),&ok); | |
| 106 | - leftEye = QtUtils::toPoint(pinEyes.at(1),&ok); | |
| 107 | - } | |
| 108 | - | |
| 109 | - if (!ok) { | |
| 110 | - if (src.file.contains(pinEyes.at(0)) && src.file.contains(pinEyes.at(1))) | |
| 111 | - { | |
| 112 | - rightEye = src.file.get<QPointF>(pinEyes.at(0), QPointF()); | |
| 113 | - leftEye = src.file.get<QPointF>(pinEyes.at(1), QPointF()); | |
| 114 | - ok = true; | |
| 115 | - } | |
| 119 | + for (int i = 0; i < nLandmarks; i++) { | |
| 120 | + if (i == 38) /*Stasm Right Eye*/ { pins[2*i] = rightEye.x(); pins[2*i+1] = rightEye.y(); } | |
| 121 | + else if (i == 39) /*Stasm Left Eye*/ { pins[2*i] = leftEye.x(); pins[2*i+1] = leftEye.y(); } | |
| 122 | + else { pins[2*i] = 0; pins[2*i+1] = 0; } | |
| 116 | 123 | } |
| 117 | 124 | |
| 118 | - float eyes[2 * stasm_NLANDMARKS]; | |
| 119 | - | |
| 120 | - if (ok) { | |
| 121 | - for (int i = 0; i < nLandmarks; i++) { | |
| 122 | - if (i == 38) /*Stasm Right Eye*/ { eyes[2*i] = rightEye.x(); eyes[2*i+1] = rightEye.y(); } | |
| 123 | - else if (i == 39) /*Stasm Left Eye*/ { eyes[2*i] = leftEye.x(); eyes[2*i+1] = leftEye.y(); } | |
| 124 | - else { eyes[2*i] = 0; eyes[2*i+1] = 0; } | |
| 125 | - } | |
| 126 | - stasm_search_pinned(landmarks, eyes, reinterpret_cast<const char*>(src.m().data), src.m().cols, src.m().rows, NULL); | |
| 125 | + stasm_search_pinned(landmarks, pins, reinterpret_cast<const char*>(src.m().data), src.m().cols, src.m().rows, NULL); | |
| 127 | 126 | |
| 128 | - // The ASM in Stasm is guaranteed to converge in this case | |
| 129 | - foundFace = 1; | |
| 130 | - } | |
| 127 | + // The ASM in Stasm is guaranteed to converge in this case | |
| 128 | + foundFace = 1; | |
| 131 | 129 | } |
| 132 | 130 | |
| 133 | 131 | if (!foundFace) stasm_search_single(&foundFace, landmarks, reinterpret_cast<const char*>(src.m().data), src.m().cols, src.m().rows, *stasmCascade, NULL, NULL); | ... | ... |