OpenCV

[Unity] Opencv+Unity 얼굴 인식부위에 이미지 넣기

Dean83 2022. 3. 29. 15:32

https://dean83.tistory.com/63 에 이어서. 

 

얼굴 인식이 되는것은 확인하였다. 그러나 실질적으로 무언가를 하기 위해선 인식된 얼굴 좌표값을 알아야 하고,

 

알아낸 좌표값으로 무언가 작업 을 해야 의미가 생긴다. 

 

 

1. 인식된 각 얼굴의 좌표값을 알아내는 법

    - FaceRecognizerScene 의 Start 함수를 보면, 얼굴인식된 결과물을 가져오는 코드가 있다.

 OpenCvSharp.Rect[] rawFaces = cascadeFaces.DetectMultiScale(gray, 1.1, 6);

    - 결과로 나온 rawFaces안에 각 인식된 얼굴이 담겨있고, 해당 rect의 좌표값과 너비 등을 이용하면 된다. 

 

2. 인식범위에 이미지 겹치기

    - 인식된 범위에 이미지를 겹치기 위해 씬 작업을 한다

   - Rawimage가 얼굴 인식을 위한 원본 이미지가 올라가는 오브젝트이다. 이 하위에 이미지 오브젝트를 추가한다.

   - 이제, 코드를 수정해야 하는데, test라고 적힌 오브젝트의 Anchor 설정에 따라 코드 수정이 달라진다. 나는 기본인

      center anchor 기준으로 수정하였다. 

   - 얼굴이 인식된 네모박스를 그리는 작업은, 이미지의 좌측 상단을 0점으로 잡고 진행이 된다. 따라서 test의 anchor를

      부모인 Rawimage 의 TopLeft로 잡으면 작업이 훨 수월해진다. 

 

   - test의 Anchor를 center로 두고 코드 작성

RectTransform trans = Instantiate(testrect);
trans.parent = testrect.parent;

float a = image.Width / 2;
float b = image.Height / 2;

trans.anchoredPosition = new Vector3(faceRect.X - a, -(faceRect.Y) + b);
trans.sizeDelta = new Vector2(faceRect.Width, faceRect.Height);
trans.localScale = testrect.parent.localScale;
trans.gameObject.SetActive(true);

    - Start 함수 적절한 위치에 코드를 삽입하면 된다. 

    - float a, b에 대한 설명 : test는 anchor가 center로, 부모인 rawimage의 중앙에서 생성이 된다.

                                    따라서 원본 이미지의 width, height 를 2로 나누어 중심좌표를 구해낸다.
    - 얼굴인식의 좌표값은, 이미지의 좌측상단을 기준점으로 삼기때문에, 중심점을 기준점으로 삼는 test와 값이 다르다.
    - 따라서 x축으로 왼쪽으로 이동해야 하고, y축으로 위쪽으로 이동해야 얼굴인식 좌표값과 시작위치가 같아진다.

    - trans.anchoredPosition X는, 일단 중심점에서 이미지 크기 반폭만큼 - 하여 왼쪽 끝으로 이동한다. 이후 faceRect

      의 X만큼 오른쪽으로 이동하면 된다. 

    - Y값의 경우도 마찬가지. 중심점에서 이미지 높이 반폭만큼 - 하여 위로 올라간다. 이후 faceRect 의 Y만큼 아래로

      이동하면 된다. 

    - 물론, anchor를 애초에 topleft로 하였다면, 그냥 facerect의 X, Y 값을 그대로 쓰면된다. 그러나 종종 anchor 조절을

      까먹기 때문에...center 기준으로 하였다.