| 1368 | } |
| 1369 | |
| 1370 | void blendIris(cv::Mat& image, const cv::Mat& iris, const std::vector<cv::Point2f>& points, float amount) |
| 1371 | { |
| 1372 | // iris right index 42�� left index 43 |
| 1373 | const int iris_indices_r[] = {35, 37, 39, 41}; |
| 1374 | const int iris_indices_l[] = {45, 47, 49, 51}; |
| 1375 | float iris_radius_r = distance(points[42], points[iris_indices_r[0]]); |
| 1376 | for(size_t i = 1; i < NELEM(iris_indices_r); ++i) |
| 1377 | { |
| 1378 | float dist = distance(points[42], points[iris_indices_r[i]]); |
| 1379 | if(iris_radius_r > dist) |
| 1380 | iris_radius_r = dist; |
| 1381 | } |
| 1382 | |
| 1383 | float iris_radius_l = distance(points[43], points[iris_indices_l[0]]); |
| 1384 | for(size_t i = 1; i < NELEM(iris_indices_l); ++i) |
| 1385 | { |
| 1386 | float dist = distance(points[43], points[iris_indices_l[i]]); |
| 1387 | if(iris_radius_l > dist) |
| 1388 | iris_radius_l = dist; |
| 1389 | } |
| 1390 | |
| 1391 | cv::Mat iris2; |
| 1392 | if(iris.channels() == 3) |
| 1393 | cvtColor(iris, iris2, CV_BGR2BGRA); |
| 1394 | iris2.convertTo(iris2, CV_32FC4, 1/255.0); |
| 1395 | |
| 1396 | const Vec3f FROM_COLOR(1.0f, 1.0f, 1.0f); // white |
| 1397 | for(int r = 0; r < iris2.rows; ++r) |
| 1398 | for(int c = 0; c < iris2.cols; ++c) |
| 1399 | { |
| 1400 | Vec4f& color = iris2.at<Vec4f>(r, c); |
| 1401 | color = venus::color2alpha(color, FROM_COLOR); |
| 1402 | } |
| 1403 | iris2.convertTo(iris2, CV_8UC4, 255.0); |
| 1404 | // cv::imwrite("color2alpha.png", iris2); |
| 1405 | |
| 1406 | // TODO it seems this value fit every iris image in res/drawable/ |
| 1407 | const float iris_image_radius = (84.0f - 12.0f)/2; |
| 1408 | |
| 1409 | Mat iris_r, iris_l; |
| 1410 | float iris_ratio_r = iris_radius_r / iris_image_radius; |
| 1411 | float iris_ratio_l = iris_radius_l / iris_image_radius; |
| 1412 | cv::resize(iris2, iris_r, Size(), iris_ratio_r, iris_ratio_r); |
| 1413 | cv::resize(iris2, iris_l, Size(), iris_ratio_l, iris_ratio_l); |
| 1414 | |
| 1415 | const Point2f& iris_center_r = points[42]; |
| 1416 | const Point2f& iris_center_l = points[43]; |
| 1417 | Point2i iris_position_r(iris_center_r.x - (iris_r.cols >> 1), iris_center_r.y - (iris_r.rows >> 1)); |
| 1418 | Point2i iris_position_l(iris_center_l.x - (iris_l.cols >> 1), iris_center_l.y - (iris_l.rows >> 1)); |
| 1419 | |
| 1420 | RoiInfo eye_info_r = calcuateEyeRegionInfo_r(points); |
| 1421 | RoiInfo eye_info_l = calcuateEyeRegionInfo_l(points); |
| 1422 | |
| 1423 | blend(iris_r, image, eye_info_r.mask, iris_position_r, amount); |
| 1424 | blend(iris_l, image, eye_info_l.mask, iris_position_l, amount); |
| 1425 | } |
| 1426 | |
| 1427 | cv::Mat resize(const cv::Mat& image, const Point2f& pivot, |
nothing calls this directly
no test coverage detected