package face import ( "fmt" "github.com/photoprism/photoprism/internal/crop" ) // Areas is a list of face landmark areas. type Areas []Area // Relative returns all areas with relative coordinates. func (pts Areas) Relative(r Area, rows, cols float32) (result crop.Areas) { for _, p := range pts { result = append(result, p.Relative(r, rows, cols)) } return result } // Area represents a face landmark position. type Area struct { Name string `json:"name,omitempty"` Row int `json:"x,omitempty"` Col int `json:"y,omitempty"` Scale int `json:"size,omitempty"` } // String returns the face landmark position as string. func (a Area) String() string { return fmt.Sprintf("%d-%d-%d", a.Row, a.Col, a.Scale) } // NewArea returns new face landmark coordinates. func NewArea(name string, row, col, scale int) Area { return Area{ Name: name, Row: row, Col: col, Scale: scale, } } // Relative returns the area with relative coordinates. func (a Area) Relative(r Area, rows, cols float32) crop.Area { if rows < 1 { rows = 1 } if cols < 1 { cols = 1 } return crop.NewArea( a.Name, float32(a.Col-r.Col)/cols, float32(a.Row-r.Row)/rows, float32(a.Scale)/cols, float32(a.Scale)/rows, ) } // TopLeft returns the top left position of the face. func (a Area) TopLeft() (int, int) { return a.Row - (a.Scale / 2), a.Col - (a.Scale / 2) }