Unity와 RealSense를 통한 얼굴과 손 인식

15156 단어 RealSenseUnity
Unity+RealSensesDK 버전이 다르고 정보가 복잡하게 얽혀 있는 느낌이 드는 것이 현재 동작 보고서의 내용이다.
그래도 머리와 손만 움직이는 모형에 쓸 수 있다.
Qiita에 동영상을 직접 붙이는 것은 어렵다.원본 파일을 깨끗이 정리했기 때문에 총결하였다pic.twitter.com/uR5f9JCSsI-금엽규(위)(@Hv2RMjzDyqXVIr)2017년 5월 28일
Version
Unity:5.6.1f1 Personal
RealSenseSDK:2016 R3
Device:SR300
가동 방법
빈 장면을 만들고 다음 코드를 카메라에 복사해서 만든 스크립트를 첨부합니다.
머리와 좌우 손 모두 가능하기 때문에 대상자를 선택할 수 있다.(머릿속에 방향을 똑똑히 보는 것이 좋다.)

주의
대칭복사 동작을 수행하려면 Update()로 좌우로 바꿉니다.
using UnityEngine;
using Intel.RealSense;
using Intel.RealSense.Face;
using Intel.RealSense.Hand;

public class RSHand : MonoBehaviour
{
    public GameObject HeadObj;
    public GameObject HandObjR;
    public GameObject HandObjL;

    SenseManager SenseM;
    FaceModule FaceM;
    HandModule HandM;
    FaceData FaceD;
    HandData HandD;

    Vector3 HeadRot = new Vector3();
    Vector3 HandPosL = new Vector3();
    Vector3 HandPosR = new Vector3();

    void Start()
    {
        SenseM = SenseManager.CreateInstance();

        HandM = HandModule.Activate(SenseM);
        HandM.FrameProcessed += Hand_FrameProcessed;
        HandD = HandM.CreateOutput();

        FaceM = FaceModule.Activate(SenseM);
        FaceM.FrameProcessed += Face_FrameProcessed;
        FaceD = FaceM.CreateOutput();

        SenseM.Init();
        SenseM.StreamFrames(false);
    }

    private void Hand_FrameProcessed(object sender, FrameProcessedEventArgs args)
    {
        HandD.Update();
        IHand[] hand;
        if (HandD.QueryHandData(AccessOrderType.ACCESS_ORDER_BY_ID, out hand) == Status.STATUS_NO_ERROR)
        {
            foreach (IHand h in hand)
            {
                if (h.BodySide == BodySideType.BODY_SIDE_LEFT)
                {
                    HandPosL.x = h.MassCenterWorld.x * -1;
                    HandPosL.y = h.MassCenterWorld.y;
                    HandPosL.z = h.MassCenterWorld.z;
                    print("### L ###" + HandPosL.x + " | " + HandPosL.y + " | " + HandPosL.z);
                }
                if (h.BodySide == BodySideType.BODY_SIDE_RIGHT)
                {
                    HandPosR.x = h.MassCenterWorld.x * -1;
                    HandPosR.y = h.MassCenterWorld.y;
                    HandPosR.z = h.MassCenterWorld.z;
                    print("### R ###" + HandPosR.x + " | " + HandPosR.y + " | " + HandPosR.z);
                }
            }
        }
    }

    private void Face_FrameProcessed(object sender, FrameProcessedEventArgs args)
    {
        FaceD.Update();
        var face = FaceD.QueryFaceByIndex(0);
        if (face != null)
        {
            HeadRot.x = face.Pose.Angles.pitch;
            HeadRot.y = face.Pose.Angles.yaw * -1;
            HeadRot.z = face.Pose.Angles.roll;
            print("### F ### " + HeadRot.x + " | " + HeadRot.y + " | " + HeadRot.z);
        }
    }

    void Update()
    {
        HeadObj.transform.eulerAngles = HeadRot;
        HandObjL.transform.position = HandPosR;
        HandObjR.transform.position = HandPosL;
    }

    void OnDestroy()
    {
        FaceM.FrameProcessed -= Face_FrameProcessed;
        HandM.FrameProcessed -= Hand_FrameProcessed;
        FaceD.Dispose();
        HandD.Dispose();
        SenseM.Dispose();
    }
}
참고 자료
http://www.buildinsider.net/small/bookrealsense/0801
http://tips.hecomi.com/entry/2015/02/25/030422
http://qiita.com/akihiro01051/items/3146b9a377bf360f58f5
https://software.intel.com/sites/landingpage/realsense/camera-sdk/v2016r3/documentation/html/index.html?doc_devguide_introduction.html
영어 못 읽는 사람이 마지막 책을 읽을 때.
Chrome로 주소 표시줄에서 번역 아이콘을 열어 원문과 여러 번 왕복하면 어쨌든 추천을 읽을 수 있습니다.

좋은 웹페이지 즐겨찾기