Skip to content

Commit

Permalink
enable host mode on android (the db file is saved /sdcard/RSID_hostmo…
Browse files Browse the repository at this point in the history
…de.db)

enable OnFaceDetected callback on Android
enable export/import user db on Android (use a fixed path /sdcard/RSID_exported.json)
  • Loading branch information
mengyui committed Jul 7, 2021
1 parent e22e753 commit ec11944
Show file tree
Hide file tree
Showing 27 changed files with 839 additions and 184 deletions.
2 changes: 1 addition & 1 deletion include/RealSenseID/AuthFaceprintsExtractionCallback.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class AuthFaceprintsExtractionCallback
* @param[in] status Final authentication status.
* @param[in] faceprints Pointer to the requested faceprints which were just extracted from the device.
*/
virtual void OnResult(const AuthenticateStatus status, const ExtractedFaceprints* faceprints) = 0;
virtual void OnResult(const AuthenticateStatus status, const ExtractedFaceprints& faceprints) = 0;

/**
* Called to inform the client of problems encountered during the authentication operation.
Expand Down
4 changes: 2 additions & 2 deletions include/RealSenseID/FaceAuthenticator.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,15 +252,15 @@ class RSID_API FaceAuthenticator
* @param[out] Number of users exported from the device.
* @return Status (Status::Ok on success).
*/
Status GetUsersFaceprints(Faceprints* user_features, unsigned int&num_of_users);
Status GetUsersFaceprints(std::vector<Faceprints>& user_features_out, unsigned int&number_of_users_in_out);

/**
* Insert each user entry from the array into the device's database.
* @param[in] Array of user IDs and feature descriptors.
* @param[in] Number of users in the array.
* @return Status (Status::Ok on success).
*/
Status SetUsersFaceprints (UserFaceprints * user_features, unsigned int num_of_users);
Status SetUsersFaceprints(std::vector<UserFaceprints>& user_features, unsigned int num_of_users);

private:
FaceAuthenticatorImpl* _impl = nullptr;
Expand Down
7 changes: 0 additions & 7 deletions include/RealSenseID/Faceprints.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,6 @@ class MatchElement
RealSenseID::MatchElement_t data;
};

// faceprints plus username element.
typedef struct UserFaceprints
{
char user_id[RSID_MAX_USER_ID_LENGTH_IN_DB];
Faceprints faceprints;
} UserFaceprints_t;

} // namespace RealSenseID

#endif // __FACEPRINTSS__H___
9 changes: 7 additions & 2 deletions include/RealSenseID/UserFaceprints.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ Copyright(c) 2011-2020 Intel Corporation. All Rights Reserved.

namespace RealSenseID
{
// use definition from Faceprints.h.
typedef RealSenseID::UserFaceprints_t UserFaceprints;
// faceprints plus username element.
struct UserFaceprints
{
char user_id[RSID_MAX_USER_ID_LENGTH_IN_DB];
Faceprints faceprints;
};

}
12 changes: 6 additions & 6 deletions samples/cpp/host-mode.cc
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class FaceprintsAuthClbk : public RealSenseID::AuthFaceprintsExtractionCallback
{
}

void OnResult(const RealSenseID::AuthenticateStatus status, const RealSenseID::ExtractedFaceprints* faceprints) override
void OnResult(const RealSenseID::AuthenticateStatus status, const RealSenseID::ExtractedFaceprints& faceprints) override
{
std::cout << "on_result: status: " << status << std::endl;

Expand All @@ -103,11 +103,11 @@ class FaceprintsAuthClbk : public RealSenseID::AuthFaceprintsExtractionCallback
}

RealSenseID::MatchElement scanned_faceprint;
scanned_faceprint.data.version = faceprints->data.version;
scanned_faceprint.data.featuresType = faceprints->data.featuresType;
scanned_faceprint.data.flags = faceprints->data.featuresVector[RSID_INDEX_IN_FEATURES_VECTOR_TO_FLAGS];
static_assert(sizeof(scanned_faceprint.data.featuresVector) == sizeof(faceprints->data.featuresVector), "faceprints without mask sizes does not match");
::memcpy(scanned_faceprint.data.featuresVector, faceprints->data.featuresVector, sizeof(faceprints->data.featuresVector));
scanned_faceprint.data.version = faceprints.data.version;
scanned_faceprint.data.featuresType = faceprints.data.featuresType;
scanned_faceprint.data.flags = faceprints.data.featuresVector[RSID_INDEX_IN_FEATURES_VECTOR_TO_FLAGS];
static_assert(sizeof(scanned_faceprint.data.featuresVector) == sizeof(faceprints.data.featuresVector), "faceprints without mask sizes does not match");
::memcpy(scanned_faceprint.data.featuresVector, faceprints.data.featuresVector, sizeof(faceprints.data.featuresVector));

// try to match the resulting faceprint to one of the faceprints stored in the db
RealSenseID::Faceprints updated_faceprint;
Expand Down
2 changes: 1 addition & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ target_compile_definitions(${LIBRSID_CPP_TARGET}
$<$<BOOL:${RSID_SECURE}>:RSID_SECURE>
)

set_target_properties(PROPERTIES DEBUG_POSTFIX ${RSID_DEBUG_POSTFIX})
set_target_properties(${LIBRSID_CPP_TARGET} PROPERTIES DEBUG_POSTFIX ${RSID_DEBUG_POSTFIX})

add_subdirectory("${SRC_DIR}/Logger")
add_subdirectory("${SRC_DIR}/PacketManager")
Expand Down
8 changes: 4 additions & 4 deletions src/FaceAuthenticator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -134,14 +134,14 @@ MatchResultHost FaceAuthenticator::MatchFaceprints(MatchElement& new_faceprints,
return _impl->MatchFaceprints(new_faceprints, existing_faceprints, updated_faceprints);
}

Status FaceAuthenticator::GetUsersFaceprints(Faceprints* user_features, unsigned int&num_of_users)
Status FaceAuthenticator::GetUsersFaceprints(std::vector<Faceprints>& user_features_out, unsigned int&number_of_users_in_out)
{
return _impl->GetUsersFaceprints(user_features, num_of_users);
return _impl->GetUsersFaceprints(user_features_out.data(), number_of_users_in_out);
}

Status FaceAuthenticator::SetUsersFaceprints (UserFaceprints * user_features, unsigned int num_of_users)
Status FaceAuthenticator::SetUsersFaceprints(std::vector<UserFaceprints>& user_features, unsigned int num_of_users)
{
return _impl->SetUsersFaceprints(user_features, num_of_users);
return _impl->SetUsersFaceprints(user_features.data(), num_of_users);
}

} // namespace RealSenseID
32 changes: 20 additions & 12 deletions src/FaceAuthenticatorImpl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1101,7 +1101,8 @@ Status FaceAuthenticatorImpl::ExtractFaceprintsForAuth(AuthFaceprintsExtractionC
{
LOG_ERROR(LOG_TAG, "Session start failed with status %d", static_cast<int>(status));
auto auth_status = ToAuthStatus(status);
callback.OnResult(auth_status, nullptr);
ExtractedFaceprints faceprints;
callback.OnResult(auth_status, faceprints);
return ToStatus(status);
}
PacketManager::FaPacket fa_packet {PacketManager::MsgId::AuthenticateFaceprintsExtraction};
Expand All @@ -1110,7 +1111,8 @@ Status FaceAuthenticatorImpl::ExtractFaceprintsForAuth(AuthFaceprintsExtractionC
{
LOG_ERROR(LOG_TAG, "Failed sending fa packet (status %d)", (int)status);
auto auth_status = ToAuthStatus(status);
callback.OnResult(auth_status, nullptr);
ExtractedFaceprints faceprints;
callback.OnResult(auth_status, faceprints);
return ToStatus(status);
}
PacketManager::Timer session_timer {CommonValues::auth_max_timeout};
Expand All @@ -1120,7 +1122,8 @@ Status FaceAuthenticatorImpl::ExtractFaceprintsForAuth(AuthFaceprintsExtractionC
if (session_timer.ReachedTimeout())
{
LOG_ERROR(LOG_TAG, "session timeout");
callback.OnResult(AuthenticateStatus::Failure, nullptr);
ExtractedFaceprints faceprints;
callback.OnResult(AuthenticateStatus::Failure, faceprints);
Cancel();
}

Expand All @@ -1132,7 +1135,8 @@ Status FaceAuthenticatorImpl::ExtractFaceprintsForAuth(AuthFaceprintsExtractionC
{
LOG_ERROR(LOG_TAG, "Failed receiving data packet (status %d)", (int)status);
auto auth_status = ToAuthStatus(status);
callback.OnResult(auth_status, nullptr);
ExtractedFaceprints faceprints;
callback.OnResult(auth_status, faceprints);
return ToStatus(status);
}

Expand Down Expand Up @@ -1164,7 +1168,7 @@ Status FaceAuthenticatorImpl::ExtractFaceprintsForAuth(AuthFaceprintsExtractionC
static_assert(sizeof(faceprints.data.featuresVector) == sizeof(received_desc->featuresVector), "adaptive faceprints (without mask) sizes does not match");
::memcpy(faceprints.data.featuresVector, received_desc->featuresVector, copySize);

callback.OnResult(AuthenticateStatus::Success, &faceprints);
callback.OnResult(AuthenticateStatus::Success, faceprints);
continue;
}
else
Expand Down Expand Up @@ -1213,7 +1217,10 @@ Status FaceAuthenticatorImpl::ExtractFaceprintsForAuth(AuthFaceprintsExtractionC
received_faceprints_in_host = false;
}
else
callback.OnResult(AuthenticateStatus(fa_status), nullptr);
{
ExtractedFaceprints faceprints;
callback.OnResult(AuthenticateStatus(fa_status), faceprints);
}
break;
}

Expand All @@ -1236,7 +1243,8 @@ Status FaceAuthenticatorImpl::ExtractFaceprintsForAuth(AuthFaceprintsExtractionC
catch (...)
{
LOG_ERROR(LOG_TAG, "Unknown exception");
callback.OnResult(AuthenticateStatus::Failure, nullptr);
ExtractedFaceprints faceprints;
callback.OnResult(AuthenticateStatus::Failure, faceprints);
return Status::Error;
}
}
Expand All @@ -1261,7 +1269,7 @@ class FaceprintsLoopCallback : public AuthFaceprintsExtractionCallback
{
}

void OnResult(const AuthenticateStatus status, const ExtractedFaceprints* faceprints) override
void OnResult(const AuthenticateStatus status, const ExtractedFaceprints& faceprints) override
{
if (status == AuthenticateStatus::NoFaceDetected || status == AuthenticateStatus::DeviceError ||
status == AuthenticateStatus::SerialError || status == AuthenticateStatus::Failure)
Expand Down Expand Up @@ -1340,7 +1348,7 @@ bool FaceAuthenticatorImpl::ValidateUserId(const char* user_id)
return is_valid;
}

Status FaceAuthenticatorImpl::GetUsersFaceprints(Faceprints* user_features, unsigned int& num_of_users)
Status FaceAuthenticatorImpl::GetUsersFaceprints(Faceprints user_features[], unsigned int& number_of_users_in_out)
{
auto status = _session.Start(_serial.get());
bool all_is_well = true;
Expand All @@ -1350,8 +1358,8 @@ Status FaceAuthenticatorImpl::GetUsersFaceprints(Faceprints* user_features, unsi
LOG_ERROR(LOG_TAG, "Session start failed with status %d", static_cast<int>(status));
return ToStatus(status);
}
QueryNumberOfUsers(num_of_users);
for (uint16_t i = 0; i < num_of_users; i++)
QueryNumberOfUsers(number_of_users_in_out);
for (uint16_t i = 0; i < number_of_users_in_out; i++)
{
try
{
Expand Down Expand Up @@ -1426,7 +1434,7 @@ Status FaceAuthenticatorImpl::GetUsersFaceprints(Faceprints* user_features, unsi
return all_is_well ? Status::Ok : ToStatus(bad_status);
}

Status FaceAuthenticatorImpl::SetUsersFaceprints(UserFaceprints* user_features, unsigned int num_of_users)
Status FaceAuthenticatorImpl::SetUsersFaceprints(UserFaceprints user_features[], unsigned int num_of_users)
{
bool all_users_set = true;
auto status = _session.Start(_serial.get());
Expand Down
4 changes: 2 additions & 2 deletions src/FaceAuthenticatorImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ class FaceAuthenticatorImpl
MatchResultHost MatchFaceprints(MatchElement& new_faceprints, Faceprints& existing_faceprints,
Faceprints& updated_faceprints);

Status GetUsersFaceprints(Faceprints* user_features, unsigned int& num_of_users);
Status SetUsersFaceprints(UserFaceprints* users_faceprints, unsigned int num_of_users);
Status GetUsersFaceprints(Faceprints user_features[], unsigned int& number_of_users_in_out);
Status SetUsersFaceprints(UserFaceprints users_faceprints[], unsigned int num_of_users);

private:
#ifdef RSID_SECURE
Expand Down
14 changes: 7 additions & 7 deletions src/Matcher/Matcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ void Matcher::HandleThresholdsConfiguration(const bool& probe_has_mask,
}

bool Matcher::GetScores(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array,
const std::vector<UserFaceprints>& existing_faceprints_array,
TagResult& result, const bool& probe_has_mask)
{

Expand Down Expand Up @@ -203,7 +203,7 @@ bool Matcher::GetScores(const MatchElement& probe_faceprints,
}

void Matcher::FaceMatch(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array, ExtendedMatchResult& result,
const std::vector<UserFaceprints>& existing_faceprints_array, ExtendedMatchResult& result,
const bool& probe_has_mask)
{
result.isSame = false;
Expand Down Expand Up @@ -294,7 +294,7 @@ bool Matcher::ValidateFaceprints(const MatchElement& faceprints)
}

ExtendedMatchResult Matcher::MatchFaceprintsToArray(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array,
const std::vector<UserFaceprints>& existing_faceprints_array,
Faceprints& updated_faceprints)
{
Thresholds thresholds;
Expand Down Expand Up @@ -416,7 +416,7 @@ ExtendedMatchResult Matcher::MatchFaceprintsToArray(const MatchElement& probe_fa
}

ExtendedMatchResult Matcher::MatchFaceprintsToArray(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array,
const std::vector<UserFaceprints>& existing_faceprints_array,
Faceprints& updated_faceprints, Thresholds& thresholds)
{
ExtendedMatchResult result;
Expand Down Expand Up @@ -594,7 +594,7 @@ bool Matcher::LimitAdaptiveVector(feature_t* adaptive_faceprints_vec, const feat
return success;
}

static void ConvertFaceprintsToUserFaceprints(const Faceprints& faceprints, UserFaceprints_t& extended_faceprints)
static void ConvertFaceprintsToUserFaceprints(const Faceprints& faceprints, UserFaceprints& extended_faceprints)
{
extended_faceprints.faceprints.data.version = faceprints.data.version;
extended_faceprints.faceprints.data.featuresType = faceprints.data.featuresType;
Expand Down Expand Up @@ -630,9 +630,9 @@ MatchResultInternal Matcher::MatchFaceprints(const MatchElement& probe_faceprint
}

// init existing faceprints array
UserFaceprints_t existing_extended_faceprints;
UserFaceprints existing_extended_faceprints;
ConvertFaceprintsToUserFaceprints(existing_faceprints, existing_extended_faceprints);
std::vector<UserFaceprints_t> existing_faceprints_array = {existing_extended_faceprints};
std::vector<UserFaceprints> existing_faceprints_array = {existing_extended_faceprints};

// match using shared code
ExtendedMatchResult result = MatchFaceprintsToArray(probe_faceprints, existing_faceprints_array, updated_faceprints);
Expand Down
9 changes: 5 additions & 4 deletions src/Matcher/Matcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#pragma once
#include "MatcherImplDefines.h"
#include "RealSenseID/Faceprints.h"
#include "RealSenseID/UserFaceprints.h"
#include <vector>
#include <stdint.h>

Expand Down Expand Up @@ -93,14 +94,14 @@ class Matcher
// returns updated faceprints if update conditions fulfilled (indicated in result.should_update).
// internal thresholds will be used.
static ExtendedMatchResult MatchFaceprintsToArray(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array,
const std::vector<UserFaceprints>& existing_faceprints_array,
Faceprints& updated_faceprints);

// match single vs. an array of faceprints. Used e.g. when matching user against a set of users in the database.
// returns updated faceprints if update conditions fulfilled (indicated in result.should_update).
// thresholds provided by caller.
static ExtendedMatchResult MatchFaceprintsToArray(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array,
const std::vector<UserFaceprints>& existing_faceprints_array,
Faceprints& updated_faceprints, Thresholds& thresholds);


Expand Down Expand Up @@ -129,11 +130,11 @@ class Matcher
static short GetMsb(const uint32_t ux);

static void FaceMatch(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array, ExtendedMatchResult& result,
const std::vector<UserFaceprints>& existing_faceprints_array, ExtendedMatchResult& result,
const bool& probe_has_mask);

static bool GetScores(const MatchElement& probe_faceprints,
const std::vector<UserFaceprints_t>& existing_faceprints_array,
const std::vector<UserFaceprints>& existing_faceprints_array,
TagResult& result, const bool& probe_has_mask);

static match_calc_t CalculateConfidence(match_calc_t score);
Expand Down
19 changes: 7 additions & 12 deletions tools/rsid-android-app/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,13 @@ android {
compileSdkVersion 29
buildToolsVersion "29.0.3"

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

defaultConfig {
applicationId "com.intel.realsenseid.f450androidexample"
minSdkVersion 23
targetSdkVersion 27
versionName "0_19_0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

}

buildTypes {
Expand All @@ -35,6 +29,10 @@ android {
dimension "default"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

applicationVariants.all { variant ->
variant.outputs.all { output ->
Expand All @@ -51,16 +49,13 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.appcompat:appcompat:1.3.0-beta01'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation project(path: ':RealSenseIDSwigClient')
implementation 'org.jetbrains:annotations:15.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
testImplementation "junit:junit:${junitVersion}"
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}


3 changes: 3 additions & 0 deletions tools/rsid-android-app/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package="com.intel.realsenseid.f450androidexample">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:allowBackup="true"
Expand All @@ -24,6 +25,8 @@
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
</application>

Expand Down
Loading

0 comments on commit ec11944

Please sign in to comment.