Detection
The basic face detection may be performed in two ways:
- By the selected parameters when you add them manually to the request. In this case, the configuration is not saved and can not be automatically repeated.
- By a processing scenario that already includes certain parameters. You can use the predefined scenarios or add a custom one. Find the exhaustive information on the Scenarios page.
The request and response parameters are described on the Detection page in the Web Service section.
detectFaces
The detectFaces
instance represents all the parameters required for the face detection operation. It takes the DetectFacesRequest
object, see it's structure.
To enable face detection, invoke:
FaceSDK.service.detectFaces(by: detectFacesRequest) { detectFacesResponse in
// handle response
}
[RFSFaceSDK.service detectFacesByRequest:detectFaceRequest completion:^(RFSDetectFacesResponse *response) {
// handle response
}];
FaceSDK.Instance().detectFaces(request) { detectFacesResponse:
DetectFacesResponse ->
// handle response
}
FaceSDK.Instance().detectFaces(detectFacesRequest, new DetectFacesCompletion() {
@Override
public void onDetectFacesCompleted(@NonNull DetectFacesResponse detectFacesResponse) {
// handle response
}
});
FaceSDK.detectFaces(detectFacesRequest, json => {
var response = DetectFacesResponse.fromJson(JSON.parse(json))
// handle response
}, _ => { })
var response = await FaceSDK.instance.detectFaces(detectFacesRequest);
// handle response
FaceSDK.detectFaces(detectFacesRequest, function(json) {
var response = DetectFacesResponse.fromJson(JSON.parse(json))
// handle response
}, function (e) { })
FaceSDK.detectFaces(detectFacesRequest).then(json => {
var response = DetectFacesResponse.fromJson(JSON.parse(json))
// handle response
})
// Android
FaceSDK.Instance().DetectFaces(detectFacesRequest, this);
public void OnDetectFacesCompleted(DetectFacesResponse response)
{
// handle response
}
// iOS
RFSFaceSDK.Service.DetectFacesByRequest(detectFacesRequest, (RFSDetectFacesResponse response) =>
{
// handle response
});
Request
By the set parameters
let detectFacesRequest = DetectFacesRequest(image: image, configuration: configuration)
RFSDetectFacesRequest *detectFacesRequest = [[RFSDetectFacesRequest alloc] initWithImage:image
configuration:configuration];
val detectFacesRequest = DetectFacesRequest(bitmap, configuration)
DetectFacesRequest detectFacesRequest = new DetectFacesRequest(bitmap, configuration);
var request = new DetectFacesRequest()
request.image = "base64"
request.configuration = config
var request = DetectFacesRequest(imageData, config);
var request = new DetectFacesRequest()
request.image = "base64"
request.configuration = config
var request = new DetectFacesRequest()
request.image = "base64"
request.configuration = config
// Android
var detectFacesRequest = new DetectFacesRequest(bitmap, configuration);
// iOS
var detectFacesRequest = new RFSDetectFacesRequest(uiImage, configuration);
By the scenario
let detectFacesRequest = DetectFacesRequest.qualityICAORequest(for: image)
RFSDetectFacesRequest *detectFaceRequest = [RFSDetectFacesRequest qualityICAORequestForImage:image];
val detectFacesRequest = DetectFacesRequest.qualityICAORequestForImage(bitmap)
DetectFacesRequest detectFacesRequest =
DetectFacesRequest.qualityICAORequestForImage(bitmap);
var request = new DetectFacesRequest()
request.scenario = Enum.DetectFacesScenario.QUALITY_ICAO
request.image = "base64"
var request = DetectFacesRequest.qualityICAO(imageData);
var request = new DetectFacesRequest()
request.scenario = Enum.DetectFacesScenario.QUALITY_ICAO
request.image = "base64"
var request = new DetectFacesRequest()
request.scenario = Enum.DetectFacesScenario.QUALITY_ICAO
request.image = "base64"
// Android
var detectFacesRequest = DetectFacesRequest.QualityICAORequestForImage(bitmap);
// iOS
var detectFacesRequest = RFSDetectFacesRequest.QualityICAORequestForImage(uiImage);
Creating configuration
The SDK uses the following configuration parameters to detect faces: onlyCentralFace
and outputImageParams
Also, you can check face image quality and evaluate attributes.
To set config parameters, invoke:
let configuration = DetectFacesConfiguration()
RFSDetectFacesConfiguration *configuration = [[RFSDetectFacesConfiguration alloc] init];
val configuration = DetectFacesConfiguration()
DetectFacesConfiguration configuration = new DetectFacesConfiguration();
var config = new DetectFacesConfig()
var config = DetectFacesConfig();
var config = new DetectFacesConfig()
var config = new DetectFacesConfig()
// Android
var configuration = new DetectFacesConfiguration();
// iOS
var configuration = new RFSDetectFacesConfiguration();
OnlyCentralFace
This parameter defines whether to process only the central face in the image or all the faces. If set to true
, the SDK detects and processes only one—the most central face in the image. If set to false
, the SDK processess all faces in the image.
configuration.onlyCentralFace = true
configuration.onlyCentralFace = YES;
configuration.onlyCentralFace = true
configuration.setOnlyCentralFace(true);
config.onlyCentralFace = true
config.onlyCentralFace = true;
config.onlyCentralFace = true
config.onlyCentralFace = true
// Android
configuration.OnlyCentralFace = (Java.Lang.Boolean)true;
// iOS
configuration.OnlyCentralFace = true;
OutputImageParams
If set, the uploaded image is processed according to the indicated settings.
let outputImageCrop = OutputImageCrop(type: .ratio2x3,
size: CGSize(width: 500, height: 600),
padColor: .black,
returnOriginalRect: true)
let outputImageParams = OutputImageParams()
outputImageParams.crop = outputImageCrop
outputImageParams.backgroundColor = .white
configuration.outputImageParams = outputImageParams
RFSOutputImageCrop *outputImageCrop = [[RFSOutputImageCrop alloc] initWithType:RFSOutputImageCropAspectRatio2x3
size:CGSizeMake(500, 750)
padColor:[UIColor whiteColor]
returnOriginalRect:YES];
RFSOutputImageParams *outputImageParams = [[RFSOutputImageParams alloc] init];
outputImageParams.crop = outputImageCrop;
outputImageParams.backgroundColor = [UIColor whiteColor];
configuration.outputImageParams = outputImageParams;
val outputImageCrop = OutputImageCrop(
OutputImageCropAspectRatio.OUTPUT_IMAGE_CROP_ASPECT_RATIO_2X3,
Size(500, 750),
Color.WHITE,
true
)
val outputImageParams = OutputImageParams(outputImageCrop, Color.WHITE)
configuration.outputImageParams = outputImageParams
OutputImageCrop outputImageCrop = new OutputImageCrop(
OutputImageCropAspectRatio.OUTPUT_IMAGE_CROP_ASPECT_RATIO_2X3,
new Size(500, 750),
Color.WHITE,
true);
OutputImageParams outputImageParams = new OutputImageParams(outputImageCrop, Color.WHITE);
configuration.setOutputImageParams(outputImageParams);
var outputImageCrop = new OutputImageCrop()
outputImageCrop.type = Enum.OutputImageCropAspectRatio.OUTPUT_IMAGE_CROP_ASPECT_RATIO_2X3
var size = new Size()
size.width = 500
size.height = 750
outputImageCrop.size = size
outputImageCrop.padColor = 0xffffffff
outputImageCrop.returnOriginalRect = true
var outputImageParams = new OutputImageParams()
outputImageParams.crop = outputImageCrop
outputImageParams.backgroundColor = 0xffffffff
config.outputImageParams = outputImageParams
var crop = OutputImageCrop(
OutputImageCropAspectRatio.RATIO_2X3,
size: Size(500, 750),
padColor: Colors.white,
returnOriginalRect: true,
);
config.outputImageParams = OutputImageParams(
crop: crop,
backgroundColor: Colors.white,
);
var outputImageCrop = new OutputImageCrop()
outputImageCrop.type = Enum.OutputImageCropAspectRatio.OUTPUT_IMAGE_CROP_ASPECT_RATIO_2X3
var size = new Size()
size.width = 500
size.height = 750
outputImageCrop.size = size
outputImageCrop.padColor = 0xffffffff
outputImageCrop.returnOriginalRect = true
var outputImageParams = new OutputImageParams()
outputImageParams.crop = outputImageCrop
outputImageParams.backgroundColor = 0xffffffff
config.outputImageParams = outputImageParams
var outputImageCrop = new OutputImageCrop()
outputImageCrop.type = Enum.OutputImageCropAspectRatio.OUTPUT_IMAGE_CROP_ASPECT_RATIO_2X3
var size = new Size()
size.width = 500
size.height = 750
outputImageCrop.size = size
outputImageCrop.padColor = 0xffffffff
outputImageCrop.returnOriginalRect = true
var outputImageParams = new OutputImageParams()
outputImageParams.crop = outputImageCrop
outputImageParams.backgroundColor = 0xffffffff
config.outputImageParams = outputImageParams
// Android
using Size = Android.Util.Size; // Add this line to the top of the file
var configuration = new DetectFacesConfiguration();
var size = new Size(500, 750);
var outputImageCrop = new OutputImageCrop(OutputImageCropAspectRatio.OutputImageCropAspectRatio2x3, size);
var outputImageParams = new OutputImageParams(outputImageCrop, 0xffffff);
configuration.OutputImageParams = outputImageParams;
// iOS
var configuration = new RFSDetectFacesConfiguration();
var size = new Size { Width = 500, Height = 750 };
var outputImageCrop = new RFSOutputImageCrop(RFSOutputImageCropAspectRatio.RFSOutputImageCropAspectRatio2x3, size);
var outputImageParams = new RFSOutputImageParams { Crop = outputImageCrop, BackgroundColor = UIColor.White };
configuration.OutputImageParams = outputImageParams;
Response
DetectFacesResponse
contains the result array, see it's structure.
let scenario = detectFacesResponse.scenario
let error = detectFacesResponse.error
let allDetections = detectFacesResponse.allDetections
let detection = detectFacesResponse.detection
NSString *scenario = response.scenario;
NSError *error = response.error;
NSArray<RFSDetectFaceResult *> *detectFaceResults = response.allDetections;
RFSDetectFaceResult *detection = response.detection;
val scenario = detectFacesResponse.scenario
val error = detectFacesResponse.error
val allDetections = detectFacesResponse.allDetections
val detection = detectFacesResponse.detection
String scenario = detectFacesResponse.getScenario();
DetectFacesErrorException error = detectFacesResponse.getError();
List<DetectFaceResult> detectFaceResults = detectFacesResponse.getAllDetections();
DetectFaceResult detection = detectFacesResponse.getDetection();
var scenario = detectFacesResponse.scenario
var error = detectFacesResponse.error
var detectFaceResults = detectFacesResponse.allDetections
var detection = detectFacesResponse.detection
var scenario = detectFacesResponse.scenario;
var error = detectFacesResponse.error;
var detectFaceResults = detectFacesResponse.allDetections;
var detection = detectFacesResponse.detection;
var scenario = detectFacesResponse.scenario
var error = detectFacesResponse.error
var detectFaceResults = detectFacesResponse.allDetections
var detection = detectFacesResponse.detection
var scenario = detectFacesResponse.scenario
var error = detectFacesResponse.error
var detectFaceResults = detectFacesResponse.allDetections
var detection = detectFacesResponse.detection
// Android
var scenario = detectFacesResponse.Scenario;
var error = detectFacesResponse.Error;
var detectFaceResults = detectFacesResponse.AllDetections;
var detection = detectFacesResponse.Detection;
// iOS
var scenario = detectFacesResponse.Scenario;
var error = detectFacesResponse.Error;
var detectFaceResults = detectFacesResponse.AllDetections;
var detection = detectFacesResponse.Detection;
DetectFaceResult
for detectFaceResult in response.allDetections! {
let qualityCompliant = detectFaceResult.isQualityCompliant
let faceRect = detectFaceResult.faceRect
let landMarks = detectFaceResult.landmarks
let cropImage = detectFaceResult.crop
let originalRect = detectFaceResult.originalRect
let attributes = detectFaceResult.attributes
let quality = detectFaceResult.quality
}
for (RFSDetectFaceResult *detectFaceResult in detectFaceResponse.allDetections) {
BOOL qualityCompliant = detectFaceResult.isQualityCompliant;
CGRect faceRect = detectFaceResult.faceRect;
NSArray<RFSPoint *> *landmarks = detectFaceResult.landmarks;
UIImage *cropImage = detectFaceResult.crop;
CGRect originalRect = detectFaceResult.originalRect;
NSArray <RFSDetectFacesAttributeResult *> *attributes = detectFaceResult.attributes;
NSArray<RFSImageQualityResult *> *quality = detectFaceResult.quality;
}
for (detectFaceResult in detectFacesResponse.allDetections!!) {
val qualityCompliant = detectFaceResult.isQualityCompliant
val faceRect = detectFaceResult.faceRect
val landMarks = detectFaceResult.landMarks
val cropImage = detectFaceResult.cropImage
val originalRect = detectFaceResult.originalRect
val attributes = detectFaceResult.attributes
val quality = detectFaceResult.quality
}
for (DetectFaceResult detectFaceResult : detectFacesResponse.getAllDetections()) {
boolean qualityCompliant = detectFaceResult.isQualityCompliant();
Rect faceRect = detectFaceResult.getFaceRect();
List<Point> landMarks = detectFaceResult.getLandMarks();
String cropImage = detectFaceResult.getCropImage();
Rect originalRect = detectFaceResult.getOriginalRect();
List<DetectFacesAttributeResult> attributes = detectFaceResult.getAttributes();
List<ImageQualityResult> quality = detectFaceResult.getQuality();
}
detectFacesResponse.allDetections?.forEach(detectFaceResult => {
var qualityCompliant = detectFaceResult.isQualityCompliant
var faceRect = detectFaceResult.faceRect
var landMarks = detectFaceResult.landmarks
var cropImage = detectFaceResult.crop
var originalRect = detectFaceResult.originalRect
var attributes = detectFaceResult.attributes
var quality = detectFaceResult.quality
})
detectFacesResponse.allDetections?.forEach((detectFaceResult) {
var qualityCompliant = detectFaceResult.isQualityCompliant;
var faceRect = detectFaceResult.faceRect;
var landMarks = detectFaceResult.landmarks;
var cropImage = detectFaceResult.crop;
var originalRect = detectFaceResult.originalRect;
var attributes = detectFaceResult.attributes;
var quality = detectFaceResult.quality;
});
detectFacesResponse.allDetections.forEach(detectFaceResult => {
var qualityCompliant = detectFaceResult.isQualityCompliant
var faceRect = detectFaceResult.faceRect
var landMarks = detectFaceResult.landmarks
var cropImage = detectFaceResult.crop
var originalRect = detectFaceResult.originalRect
var attributes = detectFaceResult.attributes
var quality = detectFaceResult.quality
})
detectFacesResponse.allDetections?.forEach(detectFaceResult => {
var qualityCompliant = detectFaceResult.isQualityCompliant
var faceRect = detectFaceResult.faceRect
var landMarks = detectFaceResult.landmarks
var cropImage = detectFaceResult.crop
var originalRect = detectFaceResult.originalRect
var attributes = detectFaceResult.attributes
var quality = detectFaceResult.quality
})
// Android
foreach (var detectFaceResult in detectFacesResponse.AllDetections)
{
var qualityCompliant = detectFaceResult.IsQualityCompliant;
var faceRect = detectFaceResult.FaceRect;
var landMarks = detectFaceResult.LandMarks;
var cropImage = detectFaceResult.CropImage;
var originalRect = detectFaceResult.OriginalRect;
var attributes = detectFaceResult.Attributes;
var quality = detectFaceResult.Quality;
}
// iOS
foreach (var detectFaceResult in detectFacesResponse.AllDetections)
{
var qualityCompliant = detectFaceResult.IsQualityCompliant;
var faceRect = detectFaceResult.FaceRect;
var landMarks = detectFaceResult.Landmarks;
var cropImage = detectFaceResult.Crop;
var originalRect = detectFaceResult.OriginalRect;
var attributes = detectFaceResult.Attributes;
var quality = detectFaceResult.Quality;
}