Vuforia на iOS - как захватить кадр камеры - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над приложением, которое использует Vuforia SDK для обнаружения целей изображения. Мне также нужно реализовать распознавание текста, что я надеялся сделать с помощью CoreML. Приложение представляет собой сочетание кода Swift и Objective-C. Первое, что мне нужно сделать, - это получить кадр камеры из сеанса Vuforia. Я хотел бы иметь его как CVPixelBuffer или UIImage. Я думаю, что это можно было бы извлечь из этой функции (не уверен, что ты):

- (void)renderFrameVuforia
{
    if(!_manager.isCameraStarted) {
        return;
    }

    // Render video background and retrieve tracking state
    const Vuforia::State state = Vuforia::TrackerManager::getInstance().getStateUpdater().updateState();
    Vuforia::Renderer::getInstance().begin(state);


    if(Vuforia::Renderer::getInstance().getVideoBackgroundConfig().mReflection == Vuforia::VIDEO_BACKGROUND_REFLECTION_ON)
    glFrontFace(GL_CW);  //Front camera
    else
    glFrontFace(GL_CCW);   //Back camera

    if(_currentRenderingPrimitives == nullptr)
    [self updateRenderingPrimitives];

    Vuforia::ViewList& viewList = _currentRenderingPrimitives->getRenderingViews();

    // Clear colour and depth buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    // Iterate over the ViewList
    for (int viewIdx = 0; viewIdx < viewList.getNumViews(); viewIdx++) {
        Vuforia::VIEW vw = viewList.getView(viewIdx);
        _currentView = vw;

        // Set up the viewport
        Vuforia::Vec4I viewport;
        // We're writing directly to the screen, so the viewport is relative to the screen
        viewport = _currentRenderingPrimitives->getViewport(vw);

        // Set viewport for current view
        glViewport(viewport.data[0], viewport.data[1], viewport.data[2], viewport.data[3]);

        //set scissor
        glScissor(viewport.data[0], viewport.data[1], viewport.data[2], viewport.data[3]);

        Vuforia::Matrix34F projMatrix = _currentRenderingPrimitives->getProjectionMatrix(vw, state.getCameraCalibration());

        Vuforia::Matrix44F rawProjectionMatrixGL = Vuforia::Tool::convertPerspectiveProjection2GLMatrix(
                                                                                                        projMatrix,
                                                                                                        _nearPlane,
                                                                                                        _farPlane);

        // Apply the appropriate eye adjustment to the raw projection matrix, and assign to the global variable
        Vuforia::Matrix44F eyeAdjustmentGL = Vuforia::Tool::convert2GLMatrix(_currentRenderingPrimitives->getEyeDisplayAdjustmentMatrix(vw));

        Vuforia::Matrix44F projectionMatrix;
        VuforiaEAGLViewUtils::multiplyMatrix(&rawProjectionMatrixGL.data[0], &eyeAdjustmentGL.data[0], &projectionMatrix.data[0]);

        if (_currentView != Vuforia::VIEW_POSTPROCESS) {
            [self renderFrameWithState:state projectMatrix:projectionMatrix];
        }

        glDisable(GL_SCISSOR_TEST);

    }

    Vuforia::Renderer::getInstance().end();
}

Может кто-нибудь направить меня, как я могу получить CVPixelBuffer из такой Vuforia сессии?

...