@@ -801,11 +801,10 @@ inline Mat FacemarkAAMImpl::linearize(std::vector<Point2f> s){ // all x values a
801
801
return linearize (Mat (s));
802
802
}
803
803
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
+ {
806
806
triangles.clear ();
807
807
808
- std::vector<int > idx;
809
808
std::vector<Vec6f> tp;
810
809
811
810
double min_x, max_x, min_y, max_y;
@@ -815,36 +814,38 @@ void FacemarkAAMImpl::delaunay(std::vector<Point2f> s, std::vector<Vec3i> & tria
815
814
minMaxIdx (s_x, &min_x, &max_x);
816
815
minMaxIdx (s_y, &min_y, &max_y);
817
816
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;
830
829
}
831
830
832
- int v1,v2,v3;
833
831
subdiv.getTriangleList (tp);
834
832
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];
837
836
838
837
// 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]));
848
849
} // for
849
850
}
850
851
0 commit comments