Oculus Rift를 사용하여 무선 입체 카메라 영상의 소스 코드 처리

4591 단어 VC++DirectXOculusRift
외부 무선 카메라 이미지는 USB를 통해 Oculus로 가져옵니다.소스 코드는 다음 URL에서 확인할 수 있습니다.
https://github.com/takeoworks/Oculus-FPV-with-VR
Oculus는 DirectX와 OpenGL 등의 기술을 사용하여 프로그래밍을 하지만 이미지 처리가 좀 번거롭다.컨트롤을 붙여넣고 데이터만 입력하면...이렇게 간단한 방법은 없다.세계 공간 좌표에 캠퍼스를 붙이는 것을 고려해야 한다. 방금 캠퍼스에서 세계 공간 좌표를 고려하여 행렬을 사용하여 로컬 이미지를 전개해야 한다.또 VC++뿐만 아니라 그래픽 속도를 높이기 위해서는 HLSL 등 차폐 언어가 필요하다.이전 프로그램이기 때문에 소스 코드를 자세히 설명할 수는 없지만 Oculus에서 외부 카메라로 이미지를 처리하고 싶은 분들은 참고하세요.

시스템 구성


전체적인 운동으로 입체 카메라의 이미지는 무선으로 날아간다.카메라 측 제어는 아두노를 사용했는데, 이는 HMD의 각도를 전달하기 위해 서보에서 제어하기 위해 사용됐다.카메라가 찍은 영상은 무선을 통해 수신기를 통해 수신된다.오큘러스 측 프로그램을 이용해 시간을 재고, 두 시점이 다른 영상을 확보해 오큘러스에 전송한다.

그림 완성



사용된 부품


Arduino UNO
Arduino Wireless SD Shield
LCD Character Display (SD1602HULB(-XA-G-G))
XBeeZB Module (To R/S Headtraking Info)
USB Explore for XBee
Camera (2SW-410AM00C000)
Tranmitter (TS 351 Wireless Transmitter)
Reciever (RC305 Wireless Reciever)
USB Mpeg Capture (Buffalo PC-SDVD/U2G)

카메라 부분 읽기 처리


카메라 이미지를 사용하는 것이 상당히 번거롭기 때문에 코드만 간단하게 소개합니다.
또한 핵심 부분은 다음과 같습니다.
https://github.com/takeoworks/Oculus-FPV-with-VR/tree/master/Samples
의 소스 코드입니다.오큘러스 티니 룸을 기반으로 카메라 영상이 표시되기 때문에 카메라 이미지에서 가상의 영상을 반복할 수 있다.조정이 필요해...
소스 코드를 테스트하려면 USB Mpeg Caputure(Buffalo PC-SSDVD/U2G)와 카메라가 필수이지만 다른 것은 모두 제작하고 싶은 시스템으로 구성됐죠.
화상 처리용 면도기, D3D11INPUT_ELEMENT_DESC에서 섀도우 처리에 대한 데이터 구조는 다음과 같이 정의됩니다.
    // Shader vertex format
    D3D11_INPUT_ELEMENT_DESC VideoCaptureVertexDesc[] = {
            { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT,    0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
            { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,       0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
            { "COLOR",    0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 }};

그런 다음 교점 섀도우와 화소 섀도우를 정의합니다.그림을 평면으로 처리할 때 다음과 같다.
    // Video Capture vertex shader
    const char* BackGroundVertexShaderSrc =
        "struct VS_INPUT {\n"
        "   float4 m_vPosition : POSITION;\n"
        "   float2 m_vTexcoord : TEXCOORD;\n"
        "   float4 m_vColor    : COLOR;\n"
        "};\n"
        "struct VS_OUTPUT {\n"
        "   float4 m_vPosition : SV_POSITION;\n"
        "   float2 m_vTexcoord : TEXCOORD;\n"
        "   float4 m_vColor    : COLOR;\n"
        "};\n"
        "float4x4 Projection;\n"
        "VS_OUTPUT main(VS_INPUT Input) {\n"
        "   VS_OUTPUT Output;\n"
        "   Output.m_vPosition = mul(Projection, Input.m_vPosition);\n"
        "   Output.m_vTexcoord = Input.m_vTexcoord;\n"
        "   Output.m_vColor = Input.m_vColor;\n"
        "   return Output;\n"
        "}\n";

    // Video Capture pixel shader
    static const char* BackGroundPixelShaderSrc =
        "struct VS_OUTPUT {\n"
        "   float4 m_vPosition : SV_POSITION;\n"
        "   float2 m_vTexcoord : TEXCOORD;\n"
        "   float4 m_vColor    : COLOR;\n"
        "};\n"
        "Texture2D          g_txDiffuse : register(t0);\n"
        "SamplerState       g_samLinear : register(s0);\n"
        "float4 main(VS_OUTPUT Input) : SV_TARGET{\n"
        "   return g_txDiffuse.Sample(g_samLinear, Input.m_vTexcoord);\n"
        "}\n";
DirectX에서 처리 객체의 정점을 설정해야 하지만 이번에는 카메라의 이미지 데이터로 처리됩니다.
이미지의 정점은 다음과 같이 정의됩니다.시계 방향으로 정점을 설정합니다.
  const VideoCapVertex CapVertex[] = {
            { { -1.0f, 1.0f, 0.0f }, { 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 0.0f } },
            { {  1.0f, 1.0f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 0.0f } },
            { { -1.0f,-1.0f, 0.0f }, { 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 0.0f } },
            { { -1.0f,-1.0f, 0.0f }, { 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 0.0f } },
            { {  1.0f, 1.0f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 0.0f } },
            { {  1.0f,-1.0f, 0.0f }, { 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 0.0f } } }; 

설명 못 드려서 죄송하지만 참고가 됐으면 좋겠어요.

좋은 웹페이지 즐겨찾기