[mob][photos] Put x and y instead of xMin and yMin in embeddingsJSON
This commit is contained in:
parent
5172ce3126
commit
1b46e159da
6 changed files with 25 additions and 34 deletions
|
@ -1,42 +1,34 @@
|
|||
/// Bounding box of a face.
|
||||
///
|
||||
/// [xMin] and [yMin] are the coordinates of the top left corner of the box, and
|
||||
/// [ x] and [y] are the minimum coordinates, so the top left corner of the box.
|
||||
/// [width] and [height] are the width and height of the box.
|
||||
///
|
||||
/// WARNING: All values are relative to the original image size, so in the range [0, 1].
|
||||
class FaceBox {
|
||||
final double xMin;
|
||||
final double yMin;
|
||||
final double x;
|
||||
final double y;
|
||||
final double width;
|
||||
final double height;
|
||||
|
||||
FaceBox({
|
||||
required this.xMin,
|
||||
required this.yMin,
|
||||
required this.x,
|
||||
required this.y,
|
||||
required this.width,
|
||||
required this.height,
|
||||
});
|
||||
|
||||
factory FaceBox.fromJson(Map<String, dynamic> json) {
|
||||
return FaceBox(
|
||||
xMin: (json['xMin'] is int
|
||||
? (json['xMin'] as int).toDouble()
|
||||
: json['xMin'] as double),
|
||||
yMin: (json['yMin'] is int
|
||||
? (json['yMin'] as int).toDouble()
|
||||
: json['yMin'] as double),
|
||||
width: (json['width'] is int
|
||||
? (json['width'] as int).toDouble()
|
||||
: json['width'] as double),
|
||||
height: (json['height'] is int
|
||||
? (json['height'] as int).toDouble()
|
||||
: json['height'] as double),
|
||||
x: (json['x'] as double?) ?? (json['xMin'] as double),
|
||||
y: (json['y'] as double?) ?? (json['yMin'] as double),
|
||||
width: json['width'] as double,
|
||||
height: json['height'] as double,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'xMin': xMin,
|
||||
'yMin': yMin,
|
||||
'x': x,
|
||||
'y': y,
|
||||
'width': width,
|
||||
'height': height,
|
||||
};
|
||||
|
|
|
@ -6,7 +6,7 @@ import "package:photos/services/machine_learning/face_ml/face_detection/detectio
|
|||
|
||||
/// Stores the face detection data, notably the bounding box and landmarks.
|
||||
///
|
||||
/// - Bounding box: [FaceBox] with xMin, yMin (so top left corner), width, height
|
||||
/// - Bounding box: [FaceBox] with x, y (minimum, so top left corner), width, height
|
||||
/// - Landmarks: list of [Landmark]s, namely leftEye, rightEye, nose, leftMouth, rightMouth
|
||||
///
|
||||
/// WARNING: All coordinates are relative to the image size, so in the range [0, 1]!
|
||||
|
@ -24,8 +24,8 @@ class Detection {
|
|||
// empty box
|
||||
Detection.empty()
|
||||
: box = FaceBox(
|
||||
xMin: 0,
|
||||
yMin: 0,
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: 0,
|
||||
height: 0,
|
||||
),
|
||||
|
|
|
@ -793,8 +793,8 @@ class FaceMlService {
|
|||
final FaceResult faceRes = result.faces[i];
|
||||
final detection = face_detection.Detection(
|
||||
box: FaceBox(
|
||||
xMin: faceRes.detection.xMinBox,
|
||||
yMin: faceRes.detection.yMinBox,
|
||||
x: faceRes.detection.xMinBox,
|
||||
y: faceRes.detection.yMinBox,
|
||||
width: faceRes.detection.width,
|
||||
height: faceRes.detection.height,
|
||||
),
|
||||
|
|
|
@ -49,10 +49,8 @@ class CroppedFaceImageView extends StatelessWidget {
|
|||
|
||||
final faceBox = face.detection.box;
|
||||
|
||||
final double relativeFaceCenterX =
|
||||
faceBox.xMin + faceBox.width / 2;
|
||||
final double relativeFaceCenterY =
|
||||
faceBox.yMin + faceBox.height / 2;
|
||||
final double relativeFaceCenterX = faceBox.x + faceBox.width / 2;
|
||||
final double relativeFaceCenterY = faceBox.y + faceBox.height / 2;
|
||||
|
||||
const double desiredFaceHeightRelativeToWidget = 8 / 10;
|
||||
final double scale =
|
||||
|
|
|
@ -110,8 +110,8 @@ FaceBoxImage _getSquareFaceBoxImage(img.Image image, FaceBox faceBox) {
|
|||
final width = (image.width * faceBox.width).round();
|
||||
final height = (image.height * faceBox.height).round();
|
||||
final side = max(width, height);
|
||||
final xImage = (image.width * faceBox.xMin).round();
|
||||
final yImage = (image.height * faceBox.yMin).round();
|
||||
final xImage = (image.width * faceBox.x).round();
|
||||
final yImage = (image.height * faceBox.y).round();
|
||||
|
||||
if (height >= width) {
|
||||
final xImageAdj = (xImage - (height - width) / 2).round();
|
||||
|
|
|
@ -559,6 +559,7 @@ Future<Image> cropImageWithCanvasSimple(
|
|||
}
|
||||
|
||||
@Deprecated('Old image processing method, use `cropImage` instead!')
|
||||
|
||||
/// Crops an [image] based on the specified [x], [y], [width] and [height].
|
||||
/// Optionally, the cropped image can be resized to comply with a [maxSize] and/or [minSize].
|
||||
/// Optionally, the cropped image can be rotated from the center by [rotation] radians.
|
||||
|
@ -1276,8 +1277,8 @@ Future<List<Uint8List>> generateFaceThumbnails(
|
|||
|
||||
for (final faceBox in faceBoxes) {
|
||||
// Note that the faceBox values are relative to the image size, so we need to convert them to absolute values first
|
||||
final double xMinAbs = faceBox.xMin * img.width;
|
||||
final double yMinAbs = faceBox.yMin * img.height;
|
||||
final double xMinAbs = faceBox.x * img.width;
|
||||
final double yMinAbs = faceBox.y * img.height;
|
||||
final double widthAbs = faceBox.width * img.width;
|
||||
final double heightAbs = faceBox.height * img.height;
|
||||
|
||||
|
@ -1323,8 +1324,8 @@ Future<List<Uint8List>> generateFaceThumbnailsUsingCanvas(
|
|||
final futureFaceThumbnails = <Future<Uint8List>>[];
|
||||
for (final faceBox in faceBoxes) {
|
||||
// Note that the faceBox values are relative to the image size, so we need to convert them to absolute values first
|
||||
final double xMinAbs = faceBox.xMin * img.width;
|
||||
final double yMinAbs = faceBox.yMin * img.height;
|
||||
final double xMinAbs = faceBox.x * img.width;
|
||||
final double yMinAbs = faceBox.y * img.height;
|
||||
final double widthAbs = faceBox.width * img.width;
|
||||
final double heightAbs = faceBox.height * img.height;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue