Skip to content

Commit 386f52c

Browse files
committed
Merge pull request #1747 from alalek:fix_contrib_1746
2 parents 1f6d6f0 + f713296 commit 386f52c

File tree

1 file changed

+28
-27
lines changed

1 file changed

+28
-27
lines changed

modules/face/src/facemarkAAM.cpp

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -801,11 +801,10 @@ inline Mat FacemarkAAMImpl::linearize(std::vector<Point2f> s){ // all x values a
801801
return linearize(Mat(s));
802802
}
803803

804-
void FacemarkAAMImpl::delaunay(std::vector<Point2f> s, std::vector<Vec3i> & triangles){
805-
804+
void FacemarkAAMImpl::delaunay(std::vector<Point2f> s, std::vector<Vec3i> & triangles)
805+
{
806806
triangles.clear();
807807

808-
std::vector<int> idx;
809808
std::vector<Vec6f> tp;
810809

811810
double min_x, max_x, min_y, max_y;
@@ -815,36 +814,38 @@ void FacemarkAAMImpl::delaunay(std::vector<Point2f> s, std::vector<Vec3i> & tria
815814
minMaxIdx(s_x, &min_x, &max_x);
816815
minMaxIdx(s_y, &min_y, &max_y);
817816

818-
// TODO: set the rectangle as configurable parameter
819-
Subdiv2D subdiv(Rect(-500,-500,1000,1000));
820-
subdiv.insert(s);
821-
822-
int a,b;
823-
subdiv.locate(s.back(),a,b);
824-
idx.resize(b+1);
825-
826-
Point2f p;
827-
for(unsigned i=0;i<s.size();i++){
828-
subdiv.locate(s[i],a,b);
829-
idx[b] = i;
817+
// TODO FIXIT Some triangles are lost
818+
//Subdiv2D subdiv(Rect(cvFloor(min_x), cvFloor(min_y), cvCeil(max_x) - cvFloor(min_x), cvCeil(max_y) - cvFloor(min_y)));
819+
Subdiv2D subdiv(Rect(cvFloor(min_x) - 10, cvFloor(min_y) - 10, cvCeil(max_x) - cvFloor(min_x) + 20, cvCeil(max_y) - cvFloor(min_y) + 20));
820+
821+
// map subdiv_verter -> original point (or the first alias)
822+
std::vector<int> idx(s.size() + 4);
823+
for (size_t i = 0; i < s.size(); ++i)
824+
{
825+
int vertex = subdiv.insert(s[i]);
826+
if (idx.size() <= (size_t)vertex)
827+
idx.resize(vertex + 1);
828+
idx[vertex] = (int)i;
830829
}
831830

832-
int v1,v2,v3;
833831
subdiv.getTriangleList(tp);
834832

835-
for(unsigned i=0;i<tp.size();i++){
836-
Vec6f t = tp[i];
833+
for (size_t i = 0; i < tp.size(); i++)
834+
{
835+
const Vec6f& t = tp[i];
837836

838837
//accept only vertex point
839-
if(t[0]>=min_x && t[0]<=max_x && t[1]>=min_y && t[1]<=max_y
840-
&& t[2]>=min_x && t[2]<=max_x && t[3]>=min_y && t[3]<=max_y
841-
&& t[4]>=min_x && t[4]<=max_x && t[5]>=min_y && t[5]<=max_y
842-
){
843-
subdiv.locate(Point2f(t[0],t[1]),a,v1);
844-
subdiv.locate(Point2f(t[2],t[3]),a,v2);
845-
subdiv.locate(Point2f(t[4],t[5]),a,v3);
846-
triangles.push_back(Vec3i(idx[v1],idx[v2],idx[v3]));
847-
} //if
838+
CV_Assert(
839+
t[0]>=min_x && t[0]<=max_x && t[1]>=min_y && t[1]<=max_y &&
840+
t[2]>=min_x && t[2]<=max_x && t[3]>=min_y && t[3]<=max_y &&
841+
t[4]>=min_x && t[4]<=max_x && t[5]>=min_y && t[5]<=max_y
842+
);
843+
844+
int tmp = 0, v1 = 0, v2 = 0, v3 = 0;
845+
subdiv.locate(Point2f(t[0], t[1]), tmp, v1);
846+
subdiv.locate(Point2f(t[2], t[3]), tmp, v2);
847+
subdiv.locate(Point2f(t[4], t[5]), tmp, v3);
848+
triangles.push_back(Vec3i(idx[v1], idx[v2], idx[v3]));
848849
} // for
849850
}
850851

0 commit comments

Comments
 (0)