Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Face mesh aspect is distorted when drawn over preview view (width is too narrow) #1

Open
MonteCreasor opened this issue Jan 11, 2024 · 2 comments

Comments

@MonteCreasor
Copy link

MonteCreasor commented Jan 11, 2024

Your code does not correctly map the face mesh points from the analysis aspect ratio to the preview aspect ratio for both the rear and front cameras. This new adjustPoint() method below will properly handle both front and rear cameras and in both cases, the mesh will be the exact correct size and perfectly aligned over the user's face. I've also included a new adjustSize that will ensure that the bounding box is scaled properly for both cameras and is aligned over the mesh for the front camera. This is just a quick fix. In my version, I will be optimizing this code.

fun adjustPoint(
    point: PointF,
    imageWidth: Int,
    imageHeight: Int,
    screenWidth: Int,
    screenHeight: Int,
    isFrontCamera: Boolean = true
): PointF {
    val imageAspectRatio = imageWidth.toFloat() / imageHeight
    val screenAspectRatio = screenWidth.toFloat() / screenHeight

    val scaleFactor = if (imageAspectRatio > screenAspectRatio) {
        // Width is the limiting factor.
        screenHeight.toFloat() / imageHeight
    } else {
        // Height is the limiting factor.
        screenWidth.toFloat() / imageWidth
    }

    // Calculate the horizontal offset to center the mesh.
    val offsetX = (screenWidth - (imageWidth * scaleFactor)) / 2

    // Adjust x-coordinate for mirroring if using the front camera.
    val x = if (isFrontCamera) {
        screenWidth - ((point.x * scaleFactor) + offsetX) // Mirror the x-coordinate
    } else {
        (point.x * scaleFactor) + offsetX
    }

    val y = point.y * scaleFactor // No change in the y scaling

    return PointF(x, y)
}

fun adjustSize(
    size: Size,
    imageWidth: Int,
    imageHeight: Int,
    screenWidth: Int,
    screenHeight: Int,
    isFrontCamera: Boolean = true
): Size {
    val imageAspectRatio = imageWidth.toFloat() / imageHeight
    val screenAspectRatio = screenWidth.toFloat() / screenHeight

    val scaleFactor = if (imageAspectRatio > screenAspectRatio) {
        // Width is the limiting factor.
        screenHeight.toFloat() / imageHeight
    } else {
        // Height is the limiting factor.
        screenWidth.toFloat() / imageWidth
    }

    // Adjust x-coordinate for mirroring if using the front camera.
    val width = if (isFrontCamera) {
        size.width * -scaleFactor/// imageWidth * screenWidth
    } else {
        size.width * scaleFactor/// imageWidth * screenWidth
    }

    val height = size.height * scaleFactor/// imageHeight * screenHeight
    return Size(width, height)
}
@chouaibMo
Copy link
Owner

chouaibMo commented Jan 16, 2024

Hi @MonteCreasor,
Thank you for bringing this to my attention.
Your proposed changes sound promising and would greatly improve the functionality.
Could you please submit a Pull Request with these adjustments so that we can review and merge them into the main branch?
Your contribution is much appreciated!

@MonteCreasor
Copy link
Author

MonteCreasor commented Jan 16, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants