Объемная проекция на видео - PullRequest
1 голос
/ 07 ноября 2019

Я разработал инструмент калибровки на QT для моей работы. У меня уже есть внутренние параметры для наших камер, и он определяет внешние параметры с помощью шахматной доски. Дело в том, что мой босс хотел бы добавить возможность показывать 3D-модель рядом со столом, где находится шахматная доска, когда она обнаружена. Я использую виджет OpenCV для потоковой передачи, но я не знаю, как показать поток вместе с 3D-моделью, принимая во внимание внешние особенности.

Пока мне удалось это сделать:

void camCalibration::startVisualisationAR()
{
    this->initializeVisualizers();
    this->loadXraydevice();

    //! Wait to get initial data
    boost::posix_time::milliseconds waiting_for_data(100);
    boost::this_thread::sleep(waiting_for_data);

    int count=0;
    while( m_ARVisuStarted )
    {
        //! Get color imgs from shared buffer and show it
        for( int dIdx = 0; dIdx < m_numCameras; dIdx++)
        {
            //! Color current color 
            m_sharedDataMutexes[dIdx]->lock();
                m_colorImagesLocal[ dIdx ] = m_imagesPerCamera[dIdx][0]->clone();
            m_sharedDataMutexes[ dIdx ]->unlock();

            if( m_colorImagesLocal[ dIdx ].rows != 0)
            {
                if( xaware_demo_utils::openCV2VTK( m_colorImagesLocal[ dIdx ], m_colorImagesData[ dIdx ] ))
                {
                    m_colorImagesData[ dIdx ]->Modified();

                    m_colorImagesActor[ dIdx ]->SetInput( m_colorImagesData[ dIdx ] );
                    m_colorImagesActor[ dIdx ]->SetOpacity(1);

                    //m_virtualImagesActor[ dIdx ]->SetInput( m_virtualImagesData[ dIdx ] );

                    if(count < m_numCameras)
                    {
                       m_xRayDevice_renderers[ dIdx ]->AddActor( m_colorImagesActor[ dIdx ] );
                       m_xRayDevice_renderers[ dIdx ]->AddActor( m_xRayDevice_actor );

                       vtkSmartPointer<vtkCamera> camera = m_xRayDevice_renderers[ dIdx ]->GetActiveCamera();
                       m_xRayDevice_renderers[ dIdx ]->ResetCamera();
                       camera->Zoom(1.7);

                       m_xRayDevice_renderWindows[ dIdx ]->Render();

                       count++;
                    }

                    //! Get output AR image in CV format
                    vtkSmartPointer<vtkImageData> ar_output = vtkSmartPointer<vtkImageData>::New();
                    ar_output = xaware_demo_utils::vtkWindowToImage( m_xRayDevice_renderWindows[ dIdx ]);

                    m_outputARImages[ dIdx ] = xaware_demo_utils::vtkToOpenCV( ar_output );

                    //! Convert color channels
                    cv::cvtColor( m_outputARImages[ dIdx ], m_outputARImages[ dIdx ], CV_BGRA2RGBA );
                    cv::cvtColor( m_outputARImages[ dIdx ], m_outputARImages[ dIdx ], CV_RGBA2RGB );

                    //! Sent AR images to GUI
                    m_sharedOutputDataMutexes[ dIdx ]->lock();
                        *m_outputSharedImages[ dIdx ] = m_outputARImages[ dIdx ].clone();
                    m_sharedOutputDataMutexes[ dIdx ]->unlock();
                }
            }
        }
    }

    //! Release memory
    this->closeRenderWindows();
}

Я не могу показать гораздо больше из соображений конфиденциальности.

Вот комната с шахматной доской, покаВыполнение калибровки:

Calibration ongoing

Затем я использую флажок для активации визуализации AR. Сейчас я могу просто показать 3D-модель (рентгеновское устройство, которое я заменил хорошей статуей крокодила, чтобы избежать каких-либо проблем) рядом с входами камер:

Showing 3D model with the videos

Любая идеякак я могу ограничить просмотр рендера для актера, а не для обоих актеровА как настроить масштаб и положение громкости на изображении в зависимости от параметров камеры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...