Commit 3b7c43cfe559fad777514bf28e5567836792d290

Authored by Scott Klum
2 parents 9f1f38db 906a36e9

Merge pull request #273 from biometrics/stasm_polish

misc improvements to stasm plugin
Showing 1 changed file with 14 additions and 9 deletions
openbr/plugins/stasm4.cpp
... ... @@ -85,9 +85,12 @@ class StasmTransform : public UntrainableTransform
85 85 else if (src.m().channels() != 1)
86 86 qFatal("Stasm expects single channel matrices.");
87 87  
88   - dst = src;
  88 + // Because we pass stasmSrc.data as a pointer to a function that has no
  89 + // knowledge of OpenCV regions of interest.
  90 + if (!stasmSrc.isContinuous())
  91 + qFatal("Stasm expects continuous matrix data.");
89 92  
90   - StasmCascadeClassifier *stasmCascade = stasmCascadeResource.acquire();
  93 + dst = src;
91 94  
92 95 int foundFace = 0;
93 96 int nLandmarks = stasm_NLANDMARKS;
... ... @@ -114,29 +117,31 @@ class StasmTransform : public UntrainableTransform
114 117 }
115 118  
116 119 if (searchPinned) {
117   - float pins[2 * stasm_NLANDMARKS];
  120 + float pins[2 * stasm_NLANDMARKS];
118 121  
119 122 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(); }
  123 + if (i == 38) /* Stasm Right Eye */ { pins[2*i] = rightEye.x(); pins[2*i+1] = rightEye.y(); }
  124 + else if (i == 39) /* Stasm Left Eye */ { pins[2*i] = leftEye.x(); pins[2*i+1] = leftEye.y(); }
122 125 else { pins[2*i] = 0; pins[2*i+1] = 0; }
123 126 }
124 127  
125   - stasm_search_pinned(landmarks, pins, reinterpret_cast<const char*>(stasmSrc.data), stasmSrc.cols, stasmSrc.rows, NULL);
  128 + stasm_search_pinned(landmarks, pins, reinterpret_cast<const char*>(stasmSrc.data), stasmSrc.cols, stasmSrc.rows, NULL);
126 129  
127 130 // The ASM in Stasm is guaranteed to converge in this case
128 131 foundFace = 1;
129 132 }
130 133  
131   - if (!foundFace) stasm_search_single(&foundFace, landmarks, reinterpret_cast<const char*>(stasmSrc.data), stasmSrc.cols, stasmSrc.rows, *stasmCascade, NULL, NULL);
  134 + if (!foundFace) {
  135 + StasmCascadeClassifier *stasmCascade = stasmCascadeResource.acquire();
  136 + stasm_search_single(&foundFace, landmarks, reinterpret_cast<const char*>(stasmSrc.data), stasmSrc.cols, stasmSrc.rows, *stasmCascade, NULL, NULL);
  137 + stasmCascadeResource.release(stasmCascade);
  138 + }
132 139  
133 140 if (stasm3Format) {
134 141 nLandmarks = 76;
135 142 stasm_convert_shape(landmarks, nLandmarks);
136 143 }
137 144  
138   - stasmCascadeResource.release(stasmCascade);
139   -
140 145 // For convenience, if these are the only points/rects we want to deal with as the algorithm progresses
141 146 if (clearLandmarks) {
142 147 dst.file.clearPoints();
... ...