[PATCH v6 2/3] libcamera: Add face detection controls
Harvey Yang
chenghaoyang at chromium.org
Mon Sep 23 16:45:04 CEST 2024
From: Yudhistira Erlandinata <yerlandinata at chromium.org>
Add FaceDetectMode, FaceDetectFaceRectangles, FaceDetectFaceScores,
and FaceDetectFaceLandmark. Also add ControlTypePoint for supporting
FaceDetectFaceLandmark.
Signed-off-by: Yudhistira Erlandinata <yerlandinata at chromium.org>
Co-developed-by: becker hsieh <beckerh at chromium.org>
Co-developed-by: Harvey Yang <chenghaoyang at chromium.org>
---
include/libcamera/controls.h | 6 ++
include/libcamera/meson.build | 3 +-
src/libcamera/control_ids_android.yaml | 98 ++++++++++++++++++++++++++
src/libcamera/control_ranges.yaml | 1 +
src/libcamera/controls.cpp | 6 ++
5 files changed, 113 insertions(+), 1 deletion(-)
create mode 100644 src/libcamera/control_ids_android.yaml
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 7c2bb287..bf1b8609 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -34,6 +34,7 @@ enum ControlType {
ControlTypeString,
ControlTypeRectangle,
ControlTypeSize,
+ ControlTypePoint,
};
namespace details {
@@ -87,6 +88,11 @@ struct control_type<Size> {
static constexpr ControlType value = ControlTypeSize;
};
+template<>
+struct control_type<Point> {
+ static constexpr ControlType value = ControlTypePoint;
+};
+
template<typename T, std::size_t N>
struct control_type<Span<T, N>> : public control_type<std::remove_cv_t<T>> {
};
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index a969a95d..4fff14d2 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -34,6 +34,7 @@ libcamera_headers_install_dir = get_option('includedir') / libcamera_include_dir
controls_map = {
'controls': {
+ 'android': 'control_ids_android.yaml',
'draft': 'control_ids_draft.yaml',
'core': 'control_ids_core.yaml',
'rpi/vc4': 'control_ids_rpi.yaml',
@@ -55,7 +56,7 @@ foreach mode, entry : controls_map
files_list = []
input_files = []
foreach vendor, header : entry
- if vendor != 'core' and vendor != 'draft'
+ if vendor != 'core' and vendor != 'draft' and vendor != 'android'
if vendor not in pipelines
continue
endif
diff --git a/src/libcamera/control_ids_android.yaml b/src/libcamera/control_ids_android.yaml
new file mode 100644
index 00000000..8b0d624f
--- /dev/null
+++ b/src/libcamera/control_ids_android.yaml
@@ -0,0 +1,98 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Copyright (C) 2024, Google Inc.
+#
+%YAML 1.1
+---
+# Unless otherwise stated, all controls are bi-directional, i.e. they can be
+# set through Request::controls() and returned out through Request::metadata().
+vendor: android
+controls:
+ - FaceDetectMode:
+ type: uint8_t
+ description: |
+ Reporting mode of face detection.
+
+ Currently identical to ANDROID_STATISTICS_FACE_DETECT_MODE.
+
+ \sa FaceDetectFaceRectangles
+ \sa FaceDetectFaceScores
+ \sa FaceDetectFaceLandmarks
+ \sa FaceDetectFaceIds
+
+ enum:
+ - name: FaceDetectModeOff
+ value: 0
+ description: |
+ Pipeline should not report face detection result.
+ - name: FaceDetectModeSimple
+ value: 1
+ description: |
+ Pipeline should at least report FaceDetectFaceRectangles and
+ FaceDetectFaceScores for each detected faces.
+ FaceDetectFaceLandmarks and FaceDetectFaceIds is optional.
+
+ - name: FaceDetectModeFull
+ value: 2
+ description: |
+ Pipeline should report all face controls, including
+ FaceDetectFaceRectangles, FaceDetectFaceScores,
+ FaceDetectFaceLandmarks, and FaceDeteceFaceIds.
+
+ - FaceDetectFaceRectangles:
+ type: Rectangle
+ description: |
+ Boundary rectangles of the detected faces.
+ The number of values should be the number of faces reported in
+ FaceDetectFaceRectangles.
+
+ The FaceDetectFaceRectangles control can only be returned in metadata.
+
+ Currently identical to ANDROID_STATISTICS_FACE_RECTANGLES.
+
+ size: [n]
+
+ - FaceDetectFaceScores:
+ type: uint8_t
+ description: |
+ Confidence score of each of the detected faces by face detector.
+ The range of score is [0, 100].
+ The FaceDetectFaceScores control can only be returned in metadata.
+ The number of values should be the number of faces reported in
+ FaceDetectFaceRectangles.
+
+ Currently identical to ANDROID_STATISTICS_FACE_SCORES.
+
+ size: [n]
+
+ - FaceDetectFaceLandmarks:
+ type: Point
+ description: |
+ Array of human face landmark coordinates in format:
+ [..., left_eye_i, right_eye_i, mouth_i, left_eye_i+1, ...],
+ with i = index of face.
+ The number of values should be 3 * the number of faces reported in
+ FaceDetectFaceRectangles.
+
+ The FaceDetectFaceLandmarks control can only be returned in metadata.
+
+ Currently identical to ANDROID_STATISTICS_FACE_LANDMARKS.
+
+ size: [n]
+
+ - FaceDetectFaceIds:
+ type: int32_t
+ description: |
+ Each detected face is given a unique ID that is valid for as long as
+ the face is visible to the camera device. A face that leaves the field
+ of view and later returns may be assigned a new ID.
+ The number of values should be the number of faces reported in
+ FaceDetectFaceRectangles.
+
+ The FaceDetectFaceIds control can only be returned in metadata.
+
+ Currently identical to ANDROID_STATISTICS_FACE_IDS.
+
+ size: [n]
+
+...
diff --git a/src/libcamera/control_ranges.yaml b/src/libcamera/control_ranges.yaml
index d42447d0..5c6ca414 100644
--- a/src/libcamera/control_ranges.yaml
+++ b/src/libcamera/control_ranges.yaml
@@ -14,5 +14,6 @@ ranges:
# Raspberry Pi vendor controls
rpi: 20000
# Next range starts at 30000
+ android: 30000
...
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index dba74404..c452e607 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -60,6 +60,7 @@ static constexpr size_t ControlValueSize[] = {
[ControlTypeString] = sizeof(char),
[ControlTypeRectangle] = sizeof(Rectangle),
[ControlTypeSize] = sizeof(Size),
+ [ControlTypePoint] = sizeof(Point),
};
} /* namespace */
@@ -254,6 +255,11 @@ std::string ControlValue::toString() const
str += value->toString();
break;
}
+ case ControlTypePoint: {
+ const Point *value = reinterpret_cast<const Point *>(data);
+ str += value->toString();
+ break;
+ }
case ControlTypeNone:
case ControlTypeString:
break;
--
2.46.0.792.g87dc391469-goog
More information about the libcamera-devel
mailing list