Towards better eye landmark vis.
This commit is contained in:
parent
04afc144f7
commit
a57fbdea7b
3 changed files with 37 additions and 0 deletions
|
@ -503,11 +503,13 @@ namespace OpenFaceOffline
|
|||
|
||||
List<Tuple<Point, Point>> lines = null;
|
||||
List<Tuple<double, double>> landmarks = null;
|
||||
List<Tuple<double, double>> eye_landmarks = null;
|
||||
List<Tuple<Point, Point>> gaze_lines = null;
|
||||
|
||||
if (detectionSucceeding)
|
||||
{
|
||||
landmarks = clnf_model.CalculateLandmarks();
|
||||
eye_landmarks = clnf_model.CalculateEyeLandmarks();
|
||||
lines = clnf_model.CalculateBox((float)fx, (float)fy, (float)cx, (float)cy);
|
||||
gaze_lines = face_analyser.CalculateGazeLines(scale, (float)fx, (float)fy, (float)cx, (float)cy);
|
||||
}
|
||||
|
|
|
@ -291,6 +291,17 @@ namespace CppInterop {
|
|||
return landmarks;
|
||||
}
|
||||
|
||||
System::Collections::Generic::List<System::Tuple<double, double>^>^ CalculateEyeLandmarks() {
|
||||
vector<cv::Point2d> vecLandmarks = ::LandmarkDetector::CalculateEyeLandmarks(*clnf);
|
||||
|
||||
auto landmarks = gcnew System::Collections::Generic::List<System::Tuple<double, double>^>();
|
||||
for (cv::Point2d p : vecLandmarks) {
|
||||
landmarks->Add(gcnew System::Tuple<double, double>(p.x, p.y));
|
||||
}
|
||||
|
||||
return landmarks;
|
||||
}
|
||||
|
||||
System::Collections::Generic::List<System::Windows::Media::Media3D::Point3D>^ Calculate3DLandmarks(double fx, double fy, double cx, double cy) {
|
||||
|
||||
cv::Mat_<double> shape3D = clnf->GetShape(fx, fy, cx, cy);
|
||||
|
|
|
@ -1064,6 +1064,30 @@ vector<cv::Point2d> CalculateLandmarks(CLNF& clnf_model)
|
|||
|
||||
}
|
||||
|
||||
// Computing eye landmarks (to be drawn later or in different interfaces)
|
||||
vector<cv::Point2d> CalculateEyeLandmarks(CLNF& clnf_model)
|
||||
{
|
||||
|
||||
int idx = clnf_model.patch_experts.GetViewIdx(clnf_model.params_global, 0);
|
||||
vector<cv::Point2d> to_return;
|
||||
// If the model has hierarchical updates draw those too
|
||||
for (size_t i = 0; i < clnf_model.hierarchical_models.size(); ++i)
|
||||
{
|
||||
|
||||
if (clnf_model.hierarchical_model_names[i].compare("left_eye_28") == 0 ||
|
||||
clnf_model.hierarchical_model_names[i].compare("right_eye_28") == 0)
|
||||
{
|
||||
auto lmks = CalculateLandmarks(clnf_model.hierarchical_models[i].detected_landmarks, clnf_model.hierarchical_models[i].patch_experts.visibilities[0][idx]);
|
||||
for (auto lmk : lmks)
|
||||
{
|
||||
to_return.push_back(lmk);
|
||||
}
|
||||
}
|
||||
}
|
||||
return to_return;
|
||||
}
|
||||
|
||||
|
||||
// Drawing landmarks on a face image
|
||||
void Draw(cv::Mat img, const cv::Mat_<double>& shape2D, const cv::Mat_<int>& visibilities)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue