| 847 | } |
| 848 | |
| 849 | RoiInfo calcuateBlusherRegionInfo(const std::vector<Point2f>& points, bool right/* = true*/) |
| 850 | { |
| 851 | Point2f origion; |
| 852 | Mat mask; |
| 853 | if(right) |
| 854 | { |
| 855 | origion = Point2f(points[1].x, points[1].y); |
| 856 | |
| 857 | // blush_index_l = {1, 2, 3, 62, (34+62)/2, 62, (62+41)/2 }; |
| 858 | Point polygon_r[] = |
| 859 | { |
| 860 | Point(cvRound(points[1].x), cvRound(points[1].y)), |
| 861 | Point(cvRound(points[2].x), cvRound(points[2].y)), |
| 862 | Point(cvRound(points[3].x), cvRound(points[3].y)), |
| 863 | Point(cvRound((points[3].x + points[64].x)/2), cvRound((points[3].y + points[64].y)/2)), |
| 864 | Point(cvRound(points[62].x), cvRound(points[62].y)), |
| 865 | Point(cvRound((points[62].x + points[41].x)/2), cvRound((points[62].y + points[41].y)/2)), |
| 866 | }; |
| 867 | |
| 868 | cv::fillConvexPoly(mask, polygon_r, NELEM(polygon_r), Scalar(255,255,255)); |
| 869 | |
| 870 | } |
| 871 | else |
| 872 | { |
| 873 | origion = Point2f(points[1].x, points[1].y); |
| 874 | |
| 875 | Point polygon_l[] = |
| 876 | { |
| 877 | Point(cvRound(points[11].x), cvRound(points[11].y)), |
| 878 | Point(cvRound(points[10].x), cvRound(points[10].y)), |
| 879 | Point(cvRound(points[9].x), cvRound(points[9].y)), |
| 880 | Point(cvRound((points[9].x) + points[68].x)/2, cvRound((points[9].y + points[68].y)/2)), |
| 881 | Point(cvRound(points[58].x), cvRound(points[58].y)), |
| 882 | Point(cvRound((points[58].x + points[51].x)/2), cvRound((points[58].y + points[51].y)/2)), |
| 883 | }; |
| 884 | |
| 885 | cv::fillConvexPoly(mask, polygon_l, NELEM(polygon_l), Scalar(255, 255, 255)); |
| 886 | } |
| 887 | |
| 888 | Point2f pivot = origion; |
| 889 | return RoiInfo(origion, pivot, mask); |
| 890 | } |
| 891 | |
| 892 | static void subdivLine(std::vector<Point>& contour, const Point2f& p0, const Point2f& p1, const Point2f& p2, const Point2f& p3) |
| 893 | { |