Lua
Lua
Amazon Rekognition - Detect Faces in an Image
See more Amazon Rekognition Examples
Detects faces within an image that is provided as input. This example passes theimage as base64-encoded image bytes.Chilkat Lua Downloads
local chilkat = require("chilkat")
local rest = chilkat.Rest.new()
local authAws = chilkat.AuthAws.new()
authAws.access_key = "AWS_ACCESS_KEY"
authAws.secret_key = "AWS_SECRET_KEY"
-- Don't forget to change the region to your particular region. (Also make the same change in the call to Connect below.)
authAws.region = "us-west-2"
authAws.service_name = "rekognition"
-- SetAuthAws causes Chilkat to automatically add the following headers: Authorization, X-Amz-Date
rest:set_auth_aws(authAws)
-- URL: https://rekognition.us-west-2.amazonaws.com/
local bTls = true
local port = 443
local bAutoReconnect = true
-- Don't forget to change the region domain (us-west-2.amazonaws.com) to your particular region.
local success = rest:connect("rekognition.us-west-2.amazonaws.com", port, bTls, bAutoReconnect)
if not success then
print("ConnectFailReason: " .. rest.connect_fail_reason)
print(rest.last_error_text)
return
end
-- Note: The above code does not need to be repeatedly called for each REST request.
-- The rest object can be setup once, and then many requests can be sent. Chilkat will automatically
-- reconnect within a FullRequest* method as needed. It is only the very first connection that is explicitly
-- made via the Connect method.
-- Load the JPG to be passed as base64 in the JSON.
local bdJpg = chilkat.BinData.new()
success = bdJpg:load_file("qa_data/jpg/kid_blue_coat.jpg")
if not success then
print("Failed to load the input JPG file.")
return
end
-- We wish to send the following JSON in the body of our HTTP request:
-- {
-- "Image": {
-- "Bytes": "base64_image_bytes"
-- }
-- "Attributes": [
-- "ALL"
-- ]
-- }
-- Here is the image we used for testing:
--
-- Convert binary image bytes to base64.
-- Note: We are explicitly keeping the data inside Chilkat to avoid having to pass large strings
-- as arguments to function calls. This is important for some programming languages.
local sbJpg = chilkat.StringBuilder.new()
bdJpg:get_encoded_sb("base64", sbJpg)
local json = chilkat.JsonObject.new()
json:update_sb("Image.Bytes", sbJpg)
json:update_string("Attributes[0]", "ALL")
rest:add_header("Content-Type", "application/x-amz-json-1.1")
rest:add_header("X-Amz-Target", "RekognitionService.DetectFaces")
local sbRequestBody = chilkat.StringBuilder.new()
json:emit_sb(sbRequestBody)
local sbResponseBody = chilkat.StringBuilder.new()
success = rest:full_request_sb("POST", "/", sbRequestBody, sbResponseBody)
if not success then
print(rest.last_error_text)
return
end
local respStatusCode = rest.response_status_code
print("response status code = " .. respStatusCode)
if respStatusCode >= 400 then
print("Response Status Code = " .. respStatusCode)
print("Response Header:")
print(rest.response_header)
print("Response Body:")
print(sbResponseBody:get_as_string())
return
end
local jResp = chilkat.JsonObject.new()
jResp:load_sb(sbResponseBody)
jResp.emit_compact = false
print(jResp:emit())
-- Sample JSON response:
-- (Sample code for parsing the JSON response is shown below)
-- {
-- "FaceDetails": [
-- {
-- "AgeRange": {
-- "High": 18,
-- "Low": 8
-- },
-- "Beard": {
-- "Confidence": 98.06282806396484,
-- "Value": false
-- },
-- "BoundingBox": {
-- "Height": 0.327279269695282,
-- "Left": 0.5339247584342957,
-- "Top": 0.23660442233085632,
-- "Width": 0.35611653327941895
-- },
-- "Confidence": 99.99732971191406,
-- "Emotions": [
-- {
-- "Confidence": 99.5849380493164,
-- "Type": "HAPPY"
-- },
-- {
-- "Confidence": 0.15533843636512756,
-- "Type": "CALM"
-- },
-- {
-- "Confidence": 0.08864031732082367,
-- "Type": "SURPRISED"
-- },
-- {
-- "Confidence": 0.05476664379239082,
-- "Type": "SAD"
-- },
-- {
-- "Confidence": 0.042048510164022446,
-- "Type": "CONFUSED"
-- },
-- {
-- "Confidence": 0.038942769169807434,
-- "Type": "DISGUSTED"
-- },
-- {
-- "Confidence": 0.021463459357619286,
-- "Type": "FEAR"
-- },
-- {
-- "Confidence": 0.013858155347406864,
-- "Type": "ANGRY"
-- }
-- ],
-- "Eyeglasses": {
-- "Confidence": 98.5116195678711,
-- "Value": false
-- },
-- "EyesOpen": {
-- "Confidence": 99.65477752685547,
-- "Value": true
-- },
-- "Gender": {
-- "Confidence": 97.1164321899414,
-- "Value": "Female"
-- },
-- "Landmarks": [
-- {
-- "Type": "eyeLeft",
-- "X": 0.6554790735244751,
-- "Y": 0.35153862833976746
-- },
-- {
-- "Type": "eyeRight",
-- "X": 0.7940073609352112,
-- "Y": 0.38292214274406433
-- },
-- {
-- "Type": "mouthLeft",
-- "X": 0.6188991069793701,
-- "Y": 0.46431097388267517
-- },
-- {
-- "Type": "mouthRight",
-- "X": 0.7352844476699829,
-- "Y": 0.490242063999176
-- },
-- {
-- "Type": "nose",
-- "X": 0.7125006914138794,
-- "Y": 0.44607019424438477
-- },
-- {
-- "Type": "leftEyeBrowLeft",
-- "X": 0.6096581220626831,
-- "Y": 0.3071737587451935
-- },
-- {
-- "Type": "leftEyeBrowRight",
-- "X": 0.6628581285476685,
-- "Y": 0.3133310079574585
-- },
-- {
-- "Type": "leftEyeBrowUp",
-- "X": 0.7027584314346313,
-- "Y": 0.33200803399086
-- },
-- {
-- "Type": "rightEyeBrowLeft",
-- "X": 0.7813941240310669,
-- "Y": 0.35023579001426697
-- },
-- {
-- "Type": "rightEyeBrowRight",
-- "X": 0.8213478922843933,
-- "Y": 0.34993964433670044
-- },
-- {
-- "Type": "rightEyeBrowUp",
-- "X": 0.8495538234710693,
-- "Y": 0.36189284920692444
-- },
-- {
-- "Type": "leftEyeLeft",
-- "X": 0.629088282585144,
-- "Y": 0.34286588430404663
-- },
-- {
-- "Type": "leftEyeRight",
-- "X": 0.6820939183235168,
-- "Y": 0.3586524724960327
-- },
-- {
-- "Type": "leftEyeUp",
-- "X": 0.6580297946929932,
-- "Y": 0.3468707501888275
-- },
-- {
-- "Type": "leftEyeDown",
-- "X": 0.6537532210350037,
-- "Y": 0.35663917660713196
-- },
-- {
-- "Type": "rightEyeLeft",
-- "X": 0.7655976414680481,
-- "Y": 0.3776427209377289
-- },
-- {
-- "Type": "rightEyeRight",
-- "X": 0.8166338801383972,
-- "Y": 0.38544225692749023
-- },
-- {
-- "Type": "rightEyeUp",
-- "X": 0.7969376444816589,
-- "Y": 0.37844377756118774
-- },
-- {
-- "Type": "rightEyeDown",
-- "X": 0.7909533977508545,
-- "Y": 0.3877102732658386
-- },
-- {
-- "Type": "noseLeft",
-- "X": 0.6727234721183777,
-- "Y": 0.44030481576919556
-- },
-- {
-- "Type": "noseRight",
-- "X": 0.7237889170646667,
-- "Y": 0.45200300216674805
-- },
-- {
-- "Type": "mouthUp",
-- "X": 0.6882695555686951,
-- "Y": 0.4740942418575287
-- },
-- {
-- "Type": "mouthDown",
-- "X": 0.6720560789108276,
-- "Y": 0.5046101808547974
-- },
-- {
-- "Type": "leftPupil",
-- "X": 0.6554790735244751,
-- "Y": 0.35153862833976746
-- },
-- {
-- "Type": "rightPupil",
-- "X": 0.7940073609352112,
-- "Y": 0.38292214274406433
-- },
-- {
-- "Type": "upperJawlineLeft",
-- "X": 0.5517005324363708,
-- "Y": 0.30355724692344666
-- },
-- {
-- "Type": "midJawlineLeft",
-- "X": 0.5320234894752502,
-- "Y": 0.43352627754211426
-- },
-- {
-- "Type": "chinBottom",
-- "X": 0.6419994831085205,
-- "Y": 0.5531964302062988
-- },
-- {
-- "Type": "midJawlineRight",
-- "X": 0.7752369046211243,
-- "Y": 0.48957017064094543
-- },
-- {
-- "Type": "upperJawlineRight",
-- "X": 0.8515444397926331,
-- "Y": 0.37258899211883545
-- }
-- ],
-- "MouthOpen": {
-- "Confidence": 68.26280212402344,
-- "Value": false
-- },
-- "Mustache": {
-- "Confidence": 99.73213195800781,
-- "Value": false
-- },
-- "Pose": {
-- "Pitch": -11.299633026123047,
-- "Roll": 17.6924991607666,
-- "Yaw": 13.582314491271973
-- },
-- "Quality": {
-- "Brightness": 83.72581481933594,
-- "Sharpness": 67.22731018066406
-- },
-- "Smile": {
-- "Confidence": 98.4793930053711,
-- "Value": true
-- },
-- "Sunglasses": {
-- "Confidence": 99.3582992553711,
-- "Value": false
-- }
-- }
-- ]
-- }
-- Sample code for parsing the JSON response...
-- Use the following online tool to generate parsing code from sample JSON:
-- Generate Parsing Code from JSON
local AgeRangeHigh = 0
local AgeRangeLow = 0
local BeardConfidence = ""
local BeardValue = false
local BoundingBoxHeight = ""
local BoundingBoxLeft = ""
local BoundingBoxTop = ""
local BoundingBoxWidth = ""
local Confidence = ""
local EyeglassesConfidence = ""
local EyeglassesValue = false
local EyesOpenConfidence = ""
local EyesOpenValue = false
local GenderConfidence = ""
local GenderValue = ""
local MouthOpenConfidence = ""
local MouthOpenValue = false
local MustacheConfidence = ""
local MustacheValue = false
local PosePitch = ""
local PoseRoll = ""
local PoseYaw = ""
local QualityBrightness = ""
local QualitySharpness = ""
local SmileConfidence = ""
local SmileValue = false
local SunglassesConfidence = ""
local SunglassesValue = false
local j = 0
local count_j = 0
local v_Type = ""
local X = ""
local Y = ""
local i = 0
local count_i = jResp:size_of_array("FaceDetails")
while i < count_i do
jResp.i = i
AgeRangeHigh = jResp:int_of("FaceDetails[i].AgeRange.High")
AgeRangeLow = jResp:int_of("FaceDetails[i].AgeRange.Low")
BeardConfidence = jResp:string_of("FaceDetails[i].Beard.Confidence")
BeardValue = jResp:bool_of("FaceDetails[i].Beard.Value")
BoundingBoxHeight = jResp:string_of("FaceDetails[i].BoundingBox.Height")
BoundingBoxLeft = jResp:string_of("FaceDetails[i].BoundingBox.Left")
BoundingBoxTop = jResp:string_of("FaceDetails[i].BoundingBox.Top")
BoundingBoxWidth = jResp:string_of("FaceDetails[i].BoundingBox.Width")
Confidence = jResp:string_of("FaceDetails[i].Confidence")
EyeglassesConfidence = jResp:string_of("FaceDetails[i].Eyeglasses.Confidence")
EyeglassesValue = jResp:bool_of("FaceDetails[i].Eyeglasses.Value")
EyesOpenConfidence = jResp:string_of("FaceDetails[i].EyesOpen.Confidence")
EyesOpenValue = jResp:bool_of("FaceDetails[i].EyesOpen.Value")
GenderConfidence = jResp:string_of("FaceDetails[i].Gender.Confidence")
GenderValue = jResp:string_of("FaceDetails[i].Gender.Value")
MouthOpenConfidence = jResp:string_of("FaceDetails[i].MouthOpen.Confidence")
MouthOpenValue = jResp:bool_of("FaceDetails[i].MouthOpen.Value")
MustacheConfidence = jResp:string_of("FaceDetails[i].Mustache.Confidence")
MustacheValue = jResp:bool_of("FaceDetails[i].Mustache.Value")
PosePitch = jResp:string_of("FaceDetails[i].Pose.Pitch")
PoseRoll = jResp:string_of("FaceDetails[i].Pose.Roll")
PoseYaw = jResp:string_of("FaceDetails[i].Pose.Yaw")
QualityBrightness = jResp:string_of("FaceDetails[i].Quality.Brightness")
QualitySharpness = jResp:string_of("FaceDetails[i].Quality.Sharpness")
SmileConfidence = jResp:string_of("FaceDetails[i].Smile.Confidence")
SmileValue = jResp:bool_of("FaceDetails[i].Smile.Value")
SunglassesConfidence = jResp:string_of("FaceDetails[i].Sunglasses.Confidence")
SunglassesValue = jResp:bool_of("FaceDetails[i].Sunglasses.Value")
j = 0
count_j = jResp:size_of_array("FaceDetails[i].Emotions")
while j < count_j do
jResp.j = j
Confidence = jResp:string_of("FaceDetails[i].Emotions[j].Confidence")
v_Type = jResp:string_of("FaceDetails[i].Emotions[j].Type")
j = j + 1
end
j = 0
count_j = jResp:size_of_array("FaceDetails[i].Landmarks")
while j < count_j do
jResp.j = j
v_Type = jResp:string_of("FaceDetails[i].Landmarks[j].Type")
X = jResp:string_of("FaceDetails[i].Landmarks[j].X")
Y = jResp:string_of("FaceDetails[i].Landmarks[j].Y")
j = j + 1
end
i = i + 1
end