Simplified copying data from Eigen matrix to C-style matrix and addressed some issues

This commit is contained in:
Kinar 2023-12-13 19:59:36 -08:00
parent 42b251cb8d
commit 6fab3a8b85
4 changed files with 36 additions and 32 deletions

View File

@ -27,11 +27,13 @@ void CppConvertToMatrix(const Eigen::MatrixXf& in, ::Matrix* out) {
out->cols = in.cols(); out->cols = in.cols();
out->data = new float[out->rows * out->cols]; out->data = new float[out->rows * out->cols];
// Copy data from Eigen matrix to C matrix in column-major order // Copy data from Eigen matrix to C-style matrix.
for (int col = 0; col < out->cols; ++col) { // This operation copies the elements sequentially as they appear in the Eigen
for (int row = 0; row < out->rows; ++row) { // matrix's internal storage, regardless of whether it's stored in row-major
out->data[col * out->rows + row] = in(row, col); // or column-major order and ensures the integrity of data during the
} // transfer.
for (int i = 0; i < out->rows * out->cols; ++i) {
out->data[i] = in.data()[i];
} }
} }

View File

@ -33,19 +33,19 @@ extern "C" {
// The hand landmarker result from HandLandmarker, where each vector // The hand landmarker result from HandLandmarker, where each vector
// element represents a single hand detected in the image. // element represents a single hand detected in the image.
struct FaceLandmarkerResult { struct FaceLandmarkerResult {
// Optional face blendshapes results.
struct Categories* face_blendshapes;
// The number of elements in the face_blendshapes array.
uint32_t face_blendshapes_count;
// Detected face landmarks in normalized image coordinates. // Detected face landmarks in normalized image coordinates.
struct NormalizedLandmarks* face_landmarks; struct NormalizedLandmarks* face_landmarks;
// The number of elements in the face_landmarks array. // The number of elements in the face_landmarks array.
uint32_t face_landmarks_count; uint32_t face_landmarks_count;
// Optional facial transformation matrix. // Optional face blendshapes results.
struct Categories* face_blendshapes;
// The number of elements in the face_blendshapes array.
uint32_t face_blendshapes_count;
// Optional facial transformation matrixes.
struct Matrix* facial_transformation_matrixes; struct Matrix* facial_transformation_matrixes;
// The number of elements in the facial_transformation_matrixes array. // The number of elements in the facial_transformation_matrixes array.

View File

@ -48,10 +48,10 @@ std::string GetFullPath(absl::string_view file_name) {
return JoinPath("./", kTestDataDirectory, file_name); return JoinPath("./", kTestDataDirectory, file_name);
} }
void MatchesFaceLandmarkerResult(FaceLandmarkerResult* result, void ExpectFaceLandmarkerResultCorrect(FaceLandmarkerResult* result,
const float blendshapes_precision, const float blendshapes_precision,
const float landmark_precision, const float landmark_precision,
const float matrix_precison) { const float matrix_precison) {
// Expects to have the same number of faces detected. // Expects to have the same number of faces detected.
EXPECT_EQ(result->face_blendshapes_count, 1); EXPECT_EQ(result->face_blendshapes_count, 1);
@ -115,9 +115,9 @@ TEST(FaceLandmarkerTest, ImageModeTest) {
FaceLandmarkerResult result; FaceLandmarkerResult result;
face_landmarker_detect_image(landmarker, mp_image, &result, face_landmarker_detect_image(landmarker, mp_image, &result,
/* error_msg */ nullptr); /* error_msg */ nullptr);
MatchesFaceLandmarkerResult(&result, kBlendshapesPrecision, ExpectFaceLandmarkerResultCorrect(&result, kBlendshapesPrecision,
kLandmarksPrecision, kLandmarksPrecision,
kFacialTransformationMatrixPrecision); kFacialTransformationMatrixPrecision);
face_landmarker_close_result(&result); face_landmarker_close_result(&result);
face_landmarker_close(landmarker, /* error_msg */ nullptr); face_landmarker_close(landmarker, /* error_msg */ nullptr);
} }
@ -157,9 +157,9 @@ TEST(FaceLandmarkerTest, VideoModeTest) {
face_landmarker_detect_for_video(landmarker, mp_image, i, &result, face_landmarker_detect_for_video(landmarker, mp_image, i, &result,
/* error_msg */ nullptr); /* error_msg */ nullptr);
MatchesFaceLandmarkerResult(&result, kBlendshapesPrecision, ExpectFaceLandmarkerResultCorrect(&result, kBlendshapesPrecision,
kLandmarksPrecision, kLandmarksPrecision,
kFacialTransformationMatrixPrecision); kFacialTransformationMatrixPrecision);
face_landmarker_close_result(&result); face_landmarker_close_result(&result);
} }
face_landmarker_close(landmarker, /* error_msg */ nullptr); face_landmarker_close(landmarker, /* error_msg */ nullptr);
@ -176,9 +176,9 @@ struct LiveStreamModeCallback {
int64_t timestamp, char* error_msg) { int64_t timestamp, char* error_msg) {
ASSERT_NE(landmarker_result, nullptr); ASSERT_NE(landmarker_result, nullptr);
ASSERT_EQ(error_msg, nullptr); ASSERT_EQ(error_msg, nullptr);
MatchesFaceLandmarkerResult(landmarker_result, kBlendshapesPrecision, ExpectFaceLandmarkerResultCorrect(landmarker_result, kBlendshapesPrecision,
kLandmarksPrecision, kLandmarksPrecision,
kFacialTransformationMatrixPrecision); kFacialTransformationMatrixPrecision);
EXPECT_GT(image.image_frame.width, 0); EXPECT_GT(image.image_frame.width, 0);
EXPECT_GT(image.image_frame.height, 0); EXPECT_GT(image.image_frame.height, 0);
EXPECT_GT(timestamp, last_timestamp); EXPECT_GT(timestamp, last_timestamp);

View File

@ -47,9 +47,9 @@ std::string GetFullPath(absl::string_view file_name) {
return JoinPath("./", kTestDataDirectory, file_name); return JoinPath("./", kTestDataDirectory, file_name);
} }
void MatchesHandLandmarkerResult(HandLandmarkerResult* result, void ExpectHandLandmarkerResultCorrect(HandLandmarkerResult* result,
const float score_precision, const float score_precision,
const float landmark_precision) { const float landmark_precision) {
// Expects to have the same number of hands detected. // Expects to have the same number of hands detected.
EXPECT_EQ(result->handedness_count, 1); EXPECT_EQ(result->handedness_count, 1);
@ -104,7 +104,8 @@ TEST(HandLandmarkerTest, ImageModeTest) {
HandLandmarkerResult result; HandLandmarkerResult result;
hand_landmarker_detect_image(landmarker, mp_image, &result, hand_landmarker_detect_image(landmarker, mp_image, &result,
/* error_msg */ nullptr); /* error_msg */ nullptr);
MatchesHandLandmarkerResult(&result, kScorePrecision, kLandmarkPrecision); ExpectHandLandmarkerResultCorrect(&result, kScorePrecision,
kLandmarkPrecision);
hand_landmarker_close_result(&result); hand_landmarker_close_result(&result);
hand_landmarker_close(landmarker, /* error_msg */ nullptr); hand_landmarker_close(landmarker, /* error_msg */ nullptr);
} }
@ -141,7 +142,8 @@ TEST(HandLandmarkerTest, VideoModeTest) {
hand_landmarker_detect_for_video(landmarker, mp_image, i, &result, hand_landmarker_detect_for_video(landmarker, mp_image, i, &result,
/* error_msg */ nullptr); /* error_msg */ nullptr);
MatchesHandLandmarkerResult(&result, kScorePrecision, kLandmarkPrecision); ExpectHandLandmarkerResultCorrect(&result, kScorePrecision,
kLandmarkPrecision);
hand_landmarker_close_result(&result); hand_landmarker_close_result(&result);
} }
hand_landmarker_close(landmarker, /* error_msg */ nullptr); hand_landmarker_close(landmarker, /* error_msg */ nullptr);
@ -158,8 +160,8 @@ struct LiveStreamModeCallback {
int64_t timestamp, char* error_msg) { int64_t timestamp, char* error_msg) {
ASSERT_NE(landmarker_result, nullptr); ASSERT_NE(landmarker_result, nullptr);
ASSERT_EQ(error_msg, nullptr); ASSERT_EQ(error_msg, nullptr);
MatchesHandLandmarkerResult(landmarker_result, kScorePrecision, ExpectHandLandmarkerResultCorrect(landmarker_result, kScorePrecision,
kLandmarkPrecision); kLandmarkPrecision);
EXPECT_GT(image.image_frame.width, 0); EXPECT_GT(image.image_frame.width, 0);
EXPECT_GT(image.image_frame.height, 0); EXPECT_GT(image.image_frame.height, 0);
EXPECT_GT(timestamp, last_timestamp); EXPECT_GT(timestamp, last_timestamp);